Purpose of the document

One of the objectives of our paper is to evaluate whether the literature of short terms health effects of air pollution suffers from power and bias issues. In this document, we carry out part of our analysis. We retrieved part of the estimates and confidence intervals of the literature in another document. To do so, we took advantage using REGular EXPressions (regex) of a somehow standardized reporting mechanism of point estimates and confidence intervals in the abstracts. The set of articles studied in details here is therefore limited to articles describing displaying confidence intervals and point estimates in their abstracts. This convention does not exist in all disciplines. For instance, it is not common practice in the economics literature but it is much more common in the epidemiology literature. This analysis thus focuses on a selected sample of the literature.

In the present document, we implement sensitivity tests in order to compute power, type M and type S error in the studied articles.

Before diving into the power analysis itself, we look at the characteristics of the articles considered.

Articles characteristics

We retrieved the articles from PubMed and Scopus using the following query on May 18, 2021:

‘TITLE((“air pollution” OR “air quality” OR “particulate matter” OR ozone OR “nitrogen dioxide” OR “sulfur dioxide” OR “PM10” OR “PM2.5” OR “carbon dioxide” OR “carbon monoxide”) AND (“emergency” OR “mortality” OR “stroke” OR “cerebrovascular” OR “cardiovascular” OR “death” OR “hospitalization”) AND NOT (“long term” OR “long-term”)) AND “short term”’

This query enables us to retrieve 1834 valid abstracts.

Themes

We can briefly explore the main (unsurprising) themes of the articles:

Detection of effects

Out of the 1834 valid articles returned by the query only a fraction reports estimates and confidence intervals in their abstracts. We therefore do not retrieve effects for all the articles returned by the query, mostly for the reason aforementioned. This might create some selection, making the sample of articles studied not representative of the whole literature. We investigate further the difference between articles that do and do not report confidence intervals in their abstracts in the following section.

Here is a list of the valid articles. The last column shows whether at least one effect was retrieved for this article.

In total, we detect 2666 valid effects and associated confidence intervals. We retrieve estimates for most of the articles mentioning “CI” in the abstract:

Number of articles for which at least one effect is retrieved (out of those containing the phrase ‘CI’)
Effect retreived Number of articles Proportion
Yes 784 0.8769575
No 110 0.1230425

Note that a bunch of abstracts contain the phrase “CI” without actually displaying effects and confidence intervals. Our algorithm seems to make a reasonably good job at detecting effects and CI when they are indeed displayed in an abstract. In addition, there is no reason to think that our ability to detect an effect would be correlated with power issues in the paper. Hence, we feel rather confident assuming that our detection algorithm selects a random (along our dimension of interest) sample of estimates among all estimates displayed in abstracts.

Representativity of articles for which an effect was retrieved

In this subsection, we investigate whether there are systematic differences between articles for which we retrieved an effect and articles that do not display an effect in their abstract or for which we did not detect one. We build this analysis such that it also provides general information about the entire set of articles.

Qualitative random analysis

First of all, we skim through a bunch of abstracts for which we retrieve an effect or not to see whether there are clear differences across study subsets. We notice that

Publication date

We first look into the distribution of published articles on this topic in time. We then wonder whether displaying effects in the abstract was a particular feature of a given period.

First, we notice that the number of articles published on short-term health effects of air pollution has been increasing rather strongly since the 1980s. The first article for which an effect is detected was published in 1992. We only found 12 articles published before 1992. This can be explained by the fact that, in most places, air pollution has only been measured consistently since the 1990s.

Even though there are slightly more recent (2010-2020) articles for which effects are retrieved, the difference does not seem to be substantial. Distributions of articles for which an effect has been retrieved and not are rather similar.

Journal and fields

We then look into the journals and academic fields in which articles on short term health effect of air pollution have been published. The results by journals are rather messy so we focus on journal areas and subareas.


Restarting R session...

Most papers on this topic have been, unsurprisingly, published in multidisciplinary journals, health or physical science journals.

One may notice that effects are not retrieved, ie not reported in the abstract or not detected, for most papers published in life science and social sciences and humanities. This might not be as problematic as they constitute a small share of the sample. There does not seem to be a particularly large imbalance in terms of journal general field for the more represented fields.

Themes

We then wonder if the words used in each sets of abstracts differ between the two sets of articles.

Apart from a few key terms, such as CI, 95 for instance, there are no huge differences in the terms used in both subsets of abstracts.

Pollutant

We take look at the pollutants considered in each article. We consider that a pollutant is studied if it is mentioned in the abstract. It is not an exact measure as some articles may mention pollutants without actually studying them but it remains an interesting metric.

First of all, we notice that a large share of papers considered here study particulate matters (PM2.5, PM10 or both).

It seems that, when there are enough articles, the likelihood of detecting an effect does not seem to vary much with the type of pollutant. Importantly, the proportion of effects retrieved is much lower for articles for which we are not able to detect the type of pollutants studied.

Outcome

As for pollutants, for some articles, we were able to retrieve studied outcomes depending on the words used in an abstract. We classified them into two categories: mortality and emergency.

Most articles studied here are interested in mortality. The proportion of articles for which an effect is retrieved seems to be larger for papers studying emergency admissions than mortality.

Subpopulation

Some articles focus on sub-populations such as infants or elderly. We are able to detect a fraction of these articles, when these terms are mentioned in the abstract. When these terms are not mentioned, either the entire population is considered or we are not able to detect the subgroup considered. The number of articles for which a subpopulation is indicated is rather small:

Subpopulation indicated Number of articles
Yes 238
No or unknown 1596

Looking more in details into the detection of effects, we get the following pattern:

There does not seem to be large variations in the proportion of articles for which an effect is detected, depending on whether a subpopulation is studied or not. Yet, this proportion is a slightly larger for elders than infants, itself larger than when when no subpopulation is detected.

Number of observations

We then look at the number of observations, the length of the the study period and the number of cities considered. Importantly, we only retrieve this information for a very limited subset of articles.

Missing Length of the study Number of cities Number of observations
False 630 832 375
True 1204 1002 1459

Our analysis is therefore to be taken with caution as there is a critical lack of information for this category.

We notice that there are large variations in the number of observations in the studies considered. However, there does not seem to be large differences along this dimension on whether an effect is retrieved or not. There seems however to be more studies around 1000 observation and less between 10,000 and 100,000 in articles for which an effect is retrieved

Now that we have quickly compared the articles for which we retrieve an effect an those for which we do not, we can dig further into the analysis of the estimates retrieved.

Analysis of the effects

In this section, we briefly analyze the effects retrieved. First, we look into the proportion of significant effects.

Significant Number of effects Proportion
No 118 0.0567581
Yes 1961 0.9432419

Most of the effects retrieved here are significant. Research mention their key findings in the abstract and therefore probably do not report non statistically significant estimates for which the null hypothesis of no effect cannot be rejected. Only a very small proportion of articles do not report any statistically significant estimates in their abstract:

At least one significant estimates Number of articles Proportion
No 7 0.0110585
Yes 626 0.9889415

We then look into the distribution of the t-scores.

There seems to be some sort of bunching for t-scores above 1.96. In this analysis, we only consider estimates reported in the abstracts. Authors may only report significant estimates in their abstracts even though they also report non significant estimates in the body of the article. This might explain this bunching. We need to investigate this further in order to understand whether this bunching is evidence of publication bias. We could investigate this further by reproducing the present analysis but analyzing the full texts and not only on the abstracts.

We then plot the distribution of the signal to noise ratio, ie the ratio of the point estimate and the width of the confidence interval.

The graph is of course analogous to the previous one. It however informs us that in a large share of the studies, the magnitude of the noise is larger than the magnitude of the effect. Looking in more details into the distribution of the signal to noise ratio, we notice that for 40% of the estimates considered here, the magnitude of the noise is more important than those of the signal.

Signal to noise ratio Percentage of estimates with a lower signal to noise ratio
0.0322581 0%
0.5265798 10%
0.6374026 20%
0.7857143 30%
1.0000000 40%
1.3108108 50%
2.1190476 60%
4.6000000 70%
10.0000000 80%
23.9457143 90%
834.8333333 100%

Power analysis

We then turn to the power analysis itself. The objective is to evaluate the power, type M and type S errors for each estimate.

To compute these values, we would need to know the true effect size. Yet, true effects are of course unknown. One solution could be to use estimates from the literature and meta-analyses as best guesses for the true value. Yet, in the setting of this systematic literature review, it is very challenging to retrieve what is exactly measured in each analysis since there is no standardized way of reporting the results. One study may for instance claim that a 10 \(\mu g/m^{3}\) increase in PM2.5 concentration leads to an increase of x% in hospital admissions over the course of a year while another study may state that a 2% increase in ozone concentration increases the number of deaths by 3 over a month. Fortunately, for each estimate retrieved, even though we do not know what is measured, we can evaluate the precision with which it is estimated.

To circumvent the fact that we do not know the actual effect size, we follow the strategy suggested by Gelman and Carlin (2014). We consider different potential “true” effect sizes and run robustness checks. This enables us to investigate what would be the power, type M and type S error if the true effect was only a fraction of the measured effect. It enables us to assess whether the design of the study is good enough to detect a smaller effect. If assuming that the true effect is 3/4 of the measured effect yields a power of 30%, there is a probably a key issue with the design of this study. This design would only enable to detect this (non zero) effect 30% of the time.

Of course, there is no reason to think a priori that a given effect would be overestimated. The results are only informative.

To carry out this analysis, we use the package retrodesign which computes post analysis design calculations (power, type M and type S errors). We run the function retro_desing() for several effect sizes.

Overal analysis

In a first part, we carry out our analysis on the whole set of abstracts. We notice that there is some heterogeneity across articles, some articles displaying a high power and others displaying lower power. Thus, in a second part, we will look in more details at articles displaying low power.

We start by computing the average and median power, type M and type S errors for a set of “true” effects.

"True" effect
Power
Type M
Type S
Mean Median Mean Median Mean Median
1% of the measured effect 0.1040123 0.0503025 59.238310 45.512417 0.3406611 0.4402240
5% of the measured effect 0.2507788 0.0575954 12.000707 9.170205 0.1944561 0.2311913
10% of the measured effect 0.3387450 0.0807551 6.159897 4.664392 0.1141361 0.0827711
33% of the measured effect 0.5389199 0.3959030 2.189054 1.573966 0.0167556 0.0003240
50% of the measured effect 0.6502209 0.7288154 1.639431 1.176970 0.0068538 0.0000041
67% of the measured effect 0.7428472 0.9309295 1.387917 1.041465 0.0037939 0.0000000
75% of the measured effect 0.7795037 0.9708755 1.314497 1.017744 0.0030488 0.0000000
90% of the measured effect 0.8365592 0.9961457 1.219197 1.002488 0.0021474 0.0000000
100% of the measured effect 0.8668059 0.9992596 1.175799 1.000497 0.0017509 0.0000000
Lower bound of the CI 0.6465227 0.9262411 4.126059 1.044272 0.0406714 0.0000000

Then, we explore graphically the distribution of power, type M and type S error across simulation and for different magnitudes of the true effect.

A large chunk of articles display high power and low rates of type M and type S error, in each robustness check. However, a non negligible number of articles display lower power and/or some evidence of type M error. Type S error does not seem to be an important issue in this literature. We investigate potential driver of low power and type M errors further in the next subsection.

Note that for type M errors, due to some outliers, we used a log scale. Without this log scale and restricting our sample to type M errors lower than 2.5 (95% of our sample, even when we assume that the true effect is only 1/3 of the estimated one).

We find that, even if the measured effect is the true effect, there is some risk of type M error.

Alternatively, we can also look at what would be the power, type M and type S if the true effect was equal to the lower bound of the confidence interval.

The ECDF also provide useful information on the distribution of power, type M and type S errors across studies.

We notice that about 50% of studies would be underpowered at the conventional 80% level if we considered that the true effect was half the measured effect.

For ECDFs too we can look at what would be the power, type M and type S error if the true effect was equal to the lower bound of the confidence interval.

Then, we look how type M and type S error evolve with power for the estimates considered.

There is a one-to-one relationship between power and type M and type S error. Not surprisingly, type M and type S error skyrocket in studies with low power.

We then investigate how average power, type M and type S evolve as a proportion of the true effect size.

Power, decreases and type M and type S errors skyrocket for small values of the true effect (as a proportion of the measured effect). In addition on average, if for each paper of the literature, the true effects are 3/4 of the measured effect, the power would be lower than the usual 80%. Type S error only seem to be an issue for small values of the true effect as a portion of the measured effect. Type M error seems to be more consistently problematic. The shoot up in the previous graph makes it difficult to read the values of type M error when the true effect is not a small portion of the measured effect. We therefore zoom in.

We notice that, on average in the literature, the treatment effects are overestimated, even for large values of the true effect. This result might be linked to some outliers. We thus look at the evolution of the median effect with true effect size.

We notice that the issue is much less important when looking at the median. This suggests some heterogeneity in terms of power in the literature.

To confirm that, we look into the evolution of the distribution with the proportion of effect size.

The overal distribution of power seems almost bimodal: either the power of most is very high or it is very low.

It might also be interesting to look at how power, type M and type S error evolved in time, ie with publication date.

There does not seem to be a clear trend in the evolution of power and type S error. However, type M error seems to have peaked in the 2010s and to be decreasing again recently.

Analysis of articles with low power

In the previous section, we noticed that a non negligible number of studies seemed to suffer from a low power issue and associated type M error. We consider that an estimate has low power if its computed power is lower than 80% if the true effect is 3/4 of the measured effect. 80% is the threshold usually used in power analyses but 3/4 is arbitrary and could be changed easily in a robustness check. Following this criterion, the number and proportion of estimates with low power is as follows:

Power Number of estimates Proportion
Adequate power 1274 0.6127946
Low power 805 0.3872054

We investigate the particularities of the articles with low power. We start by reproducing the analyses used to compare articles for which we retrieved an effect and those for which we did not. First, we look into the distribution of publication dates.

It seems that less articles with low power have been published recently, in comparison to articles with adequate power. This confirms our previous finding. We then look into the distribution of articles

Interestingly, some journals, such as “Science of the Total Environment”, the “International Journal of Occupational Medicine and Environmental Health”, the “Chochrane Database of Systematic Reviews”, “Environmental science and pollution research” and the “Journal of Exposure Science and Environmental epidemiology” publish large share of low power studies. On the contrary, BMJ Open publish very few low power studies.

Here also, grouping the journals into big main themes could be more instructive.

There does not seem to be a clear trend in the proportion of articles with low power. If anything it has slightly decreased in the last decade.

We also look into potential disparities in terms of pollutant

There does not seem to be stark differences by pollutant type.

We then compare these outcomes in terms of outcome (mortality or hospital admissions).

There is absolutely no difference along this dimension.

LS0tCnRpdGxlOiAiU3lzdGVtYXRpYyBsaXRlcmF0dXJlIHJldmlldyAtIEFuYWx5c2lzIG9mIGFic3RyYWN0cyIKYXV0aG9yOgotIG5hbWU6IFZpbmNlbnQgQmFnaWxldAogIHVybDogaHR0cHM6Ly93d3cuc2lwYS5jb2x1bWJpYS5lZHUvZXhwZXJpZW5jZS1zaXBhL3NpcGEtcHJvZmlsZXMvdmluY2VudC1iYWdpbGV0CiAgYWZmaWxpYXRpb246IENvbHVtYmlhIFVuaXZlcnNpdHkKICBhZmZpbGlhdGlvbl91cmw6IGh0dHBzOi8vd3d3LmNvbHVtYmlhLmVkdS8KLSBuYW1lOiBMw6lvIFphYnJvY2tpCiAgdXJsOiBodHRwczovL3d3dy5wYXJpc3NjaG9vbG9mZWNvbm9taWNzLmV1L2VuLwogIGFmZmlsaWF0aW9uOiBQYXJpcyBTY2hvb2wgb2YgRWNvbm9taWNzCiAgYWZmaWxpYXRpb25fdXJsOiBodHRwczovL3d3dy5wYXJpc3NjaG9vbG9mZWNvbm9taWNzLmV1L2VuLwpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBkaXN0aWxsOjpkaXN0aWxsX2FydGljbGU6IAogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICBodG1sX25vdGVib29rOiBkZWZhdWx0Ci0tLQoKPHN0eWxlPgpib2R5IHsKdGV4dC1hbGlnbjoganVzdGlmeX0KPC9zdHlsZT4KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCByZXN1bHRzPSdoaWRlJywgd2FybmluZz1GQUxTRX0KbGlicmFyeShrbml0cikKb3B0c19jaHVuayRzZXQoZmlnLnBhdGggPSAiaW1hZ2VzLyIsCiAgICAgICAgICAgICAgIGNhY2hlLnBhdGggPSAiY2FjaGUvIiwKICAgICAgICAgICAgICAgY2FjaGUgPSBGQUxTRSwKICAgICAgICAgICAgICAgZWNobyA9IEZBTFNFLCAjc2V0IHRvIGZhbHNlIHRvIGhpZGUgY29kZQogICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsCiAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwKICAgICAgICAgICAgICAgb3V0LndpZHRoID0gIjg1JSIsCiAgICAgICAgICAgICAgIGRwaSA9IDUwMCwKICAgICAgICAgICAgICAgZmlnLmFsaWduID0gImNlbnRlciIpICAKYGBgICAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGZ1bGx0ZXh0KQpsaWJyYXJ5KHRpZHl0ZXh0KQpsaWJyYXJ5KHdvcmRjbG91ZCkKbGlicmFyeShyZXRyb2Rlc2lnbikKbGlicmFyeShtZWRpb2NyZXRoZW1lcykKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoRFQpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShza2ltcikKbGlicmFyeShnZ3JpZGdlcykKCnNldF9tZWRpb2NyZV9hbGwoKQpzZXQuc2VlZCgxKQpgYGAKCiMgUHVycG9zZSBvZiB0aGUgZG9jdW1lbnQKCjwhLS0gRm9yIHllYXJzLCB0aGUgZW1waXJpY2FsIGVjb25vbWljIGxpdGVyYXR1cmUgaGFzIGJlZW4gb2JzZXNzZWQgd2l0aCB1bmJpYXNlZG5lc3MuIFJlc2VhcmNoZXJzIGhhdmUgZGV2ZWxvcGVkIGVtcGlyaWNhbCBtZXRob2RzIGFuZCB0ZWNobmlxdWVzIGluIGEgcXVlc3QgdG8gcmV0cmlldmUgdW5iaWFzZWQgZXN0aW1hdGVzLiBZZXQsIGR1ZSB0byB0aGVpciBpbmhlcmVudCBjb25zdHJhaW50cywgdGhlc2UgdGVjaG5pcXVlcyBsaW1pdCB0aGUgc2V0IG9mIHNldHRpbmdzIGluIHdoaWNoIG9uZSBjYW4gcmV0cmlldmUgY2F1c2FsIGFuZCB1bmJpYXNlZCBlc3RpbWF0ZXMuIFRoZXkgYWxzbyBvZnRlbiB0ZW5kIHRvIGZvY3VzIG9uIGxpbWl0ZWQgc2FtcGxlcyBvZiB0aGUgZGF0YSwgbGVhZGluZyB0byBhIHJlZHVjdGlvbiBpbiBzYW1wbGUgc2l6ZT8gVGhpcyBjYW4gdWx0aW1hdGVseSBsZWFkIHRvIHVuZGVycG93ZXJlZCBzdHVkaWVzLiBBcyB1bmRlcmxpbmVkIGJ5IEdlbG1hbiBhbmQgQ2FybGluICgyMDE0KSwgYSBsYWNrIG9mIHBvd2VyIGlzIG9mdGVuIGFzc29jaWF0ZWQgd2l0aCB0eXBlIE0gYW5kIHR5cGUgUyBlcnJvci4gSW4gYSBxdWVzdCBmb3IgdW5iaWFzZWRuZXNzLCBwcmFjdGl0aW9uZXJzIHVzZSBtZXRob2RzIGxlYWRpbmcgdG8gc21hbGxlciBzYW1wbGUgc2l6ZSB3aGljaCBjYW4gdWx0aW1hdGVseSBjcmVhdGUgYmlhcyAodHlwZSBNIGFuZCB0eXBlIFMgZXJyb3IpLiBXZSB0aHVzIGFpbSBhdCBhbmFseXppbmcgd2hldGhlciB0aGUgbGl0ZXJhdHVyZSBvZiBzaG9ydCB0ZXJtIGhlYWx0aCBlZmZlY3RzIG9mIGFpciBwb2xsdXRpb24gc3VmZmVycyBmcm9tIHBvd2VyLCB0eXBlIE0gYW5kIHR5cGUgUyBlcnJvciBpc3N1ZXMuIC0tPgoKT25lIG9mIHRoZSBvYmplY3RpdmVzIG9mIG91ciBwYXBlciBpcyB0byBldmFsdWF0ZSB3aGV0aGVyIHRoZSBsaXRlcmF0dXJlIG9mIHNob3J0IHRlcm1zIGhlYWx0aCBlZmZlY3RzIG9mIGFpciBwb2xsdXRpb24gc3VmZmVycyBmcm9tIHBvd2VyIGFuZCBiaWFzIGlzc3Vlcy4gSW4gdGhpcyBkb2N1bWVudCwgd2UgY2Fycnkgb3V0IHBhcnQgb2Ygb3VyIGFuYWx5c2lzLiBXZSByZXRyaWV2ZWQgcGFydCBvZiB0aGUgZXN0aW1hdGVzIGFuZCBjb25maWRlbmNlIGludGVydmFscyBvZiB0aGUgbGl0ZXJhdHVyZSBpbiBbYW5vdGhlciBkb2N1bWVudF0oc3lzdGVtYXRpY19saXRfcmV2aWV3X2dldGluZ19hYnN0cmFjdHMuaHRtbCkuIFRvIGRvIHNvLCB3ZSB0b29rIGFkdmFudGFnZSAgdXNpbmcgUkVHdWxhciBFWFByZXNzaW9ucyAocmVnZXgpIG9mIGEgc29tZWhvdyBzdGFuZGFyZGl6ZWQgcmVwb3J0aW5nIG1lY2hhbmlzbSBvZiBwb2ludCBlc3RpbWF0ZXMgYW5kIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGluIHRoZSBhYnN0cmFjdHMuIFRoZSBzZXQgb2YgYXJ0aWNsZXMgc3R1ZGllZCBpbiBkZXRhaWxzIGhlcmUgaXMgdGhlcmVmb3JlIGxpbWl0ZWQgdG8gYXJ0aWNsZXMgZGVzY3JpYmluZyBkaXNwbGF5aW5nIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGFuZCBwb2ludCBlc3RpbWF0ZXMgaW4gdGhlaXIgYWJzdHJhY3RzLiBUaGlzIGNvbnZlbnRpb24gZG9lcyBub3QgZXhpc3QgaW4gYWxsIGRpc2NpcGxpbmVzLiBGb3IgaW5zdGFuY2UsIGl0IGlzIG5vdCBjb21tb24gcHJhY3RpY2UgaW4gdGhlIGVjb25vbWljcyBsaXRlcmF0dXJlIGJ1dCBpdCBpcyBtdWNoIG1vcmUgY29tbW9uIGluIHRoZSBlcGlkZW1pb2xvZ3kgbGl0ZXJhdHVyZS4gVGhpcyBhbmFseXNpcyB0aHVzIGZvY3VzZXMgb24gYSBzZWxlY3RlZCBzYW1wbGUgb2YgdGhlIGxpdGVyYXR1cmUuCgpJbiB0aGUgcHJlc2VudCBkb2N1bWVudCwgd2UgaW1wbGVtZW50IHNlbnNpdGl2aXR5IHRlc3RzIGluIG9yZGVyIHRvIGNvbXB1dGUgcG93ZXIsIHR5cGUgTSBhbmQgdHlwZSBTIGVycm9yIGluIHRoZSBzdHVkaWVkIGFydGljbGVzLiAKCkJlZm9yZSBkaXZpbmcgaW50byB0aGUgcG93ZXIgYW5hbHlzaXMgaXRzZWxmLCB3ZSBsb29rIGF0IHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGFydGljbGVzIGNvbnNpZGVyZWQuCgo8IS0tIHdyaXRlIGEgcGFyYWdyYXBoIGV4cGxhaW5pbmcgd2h5IHRoZSByb2J1c3RuZXNzIGNoZWNrcyBtYWtlIHNlbnNlIC0tPgoKIyBBcnRpY2xlcyBjaGFyYWN0ZXJpc3RpY3MKCldlIHJldHJpZXZlZCB0aGUgYXJ0aWNsZXMgZnJvbSBQdWJNZWQgYW5kIFNjb3B1cyB1c2luZyB0aGUgZm9sbG93aW5nIHF1ZXJ5IG9uIE1heSAxOCwgMjAyMToKCidUSVRMRSgoImFpciBwb2xsdXRpb24iIE9SICJhaXIgcXVhbGl0eSIgT1IgInBhcnRpY3VsYXRlIG1hdHRlciIgT1Igb3pvbmUgT1IgIm5pdHJvZ2VuIGRpb3hpZGUiIE9SICJzdWxmdXIgZGlveGlkZSIgT1IgIlBNMTAiIE9SICJQTTIuNSIgT1IgImNhcmJvbiBkaW94aWRlIiBPUiAiY2FyYm9uIG1vbm94aWRlIikgQU5EICgiZW1lcmdlbmN5IiBPUiAibW9ydGFsaXR5IiBPUiAic3Ryb2tlIiBPUiAiY2VyZWJyb3Zhc2N1bGFyIiBPUiAiY2FyZGlvdmFzY3VsYXIiIE9SICJkZWF0aCIgT1IgImhvc3BpdGFsaXphdGlvbiIpIEFORCBOT1QgKCJsb25nIHRlcm0iIE9SICJsb25nLXRlcm0iKSkgQU5EICJzaG9ydCB0ZXJtIicKCmBgYHtyfQphYnN0cmFjdHNfYW5kX21ldGFkYXRhIDwtIHJlYWRSRFMoIi4uL091dHB1dHMvYWJzdHJhY3RzX2FuZF9tZXRhZGF0YS5SRFMiKQplc3RpbWF0ZXMgPC0gcmVhZFJEUygiLi4vT3V0cHV0cy9lc3RpbWF0ZXMuUkRTIikKYGBgCgpUaGlzIHF1ZXJ5IGVuYWJsZXMgdXMgdG8gcmV0cmlldmUgYHIgbnJvdyhhYnN0cmFjdHNfYW5kX21ldGFkYXRhKWAgdmFsaWQgYWJzdHJhY3RzLgoKIyMgVGhlbWVzCgpXZSBjYW4gYnJpZWZseSBleHBsb3JlIHRoZSBtYWluICh1bnN1cnByaXNpbmcpIHRoZW1lcyBvZiB0aGUgYXJ0aWNsZXM6CgpgYGB7cn0KYWJzdHJhY3RzX2FuZF9tZXRhZGF0YSAlPiUKICB1bm5lc3RfdG9rZW5zKHdvcmQsIGFic3RyYWN0LCB0b19sb3dlciA9IFRSVUUpICU+JSAKICBhbnRpX2pvaW4odGlkeXRleHQ6OnN0b3Bfd29yZHMsIGJ5ID0gIndvcmQiKSAlPiUKICBjb3VudCh3b3JkKSAlPiUKICB3aXRoKHdvcmRjbG91ZDo6d29yZGNsb3VkKHdvcmQsIG4sIG1heC53b3JkcyA9IDgwLCByYW5kb20uY29sb3IgPSBUUlVFLCBjb2xvcnMgPSAiIzAwMzEzQyIpKQpgYGAKCmBgYHtyIGZpZy5hc3AgPSAxfQphYnN0cmFjdHNfYW5kX21ldGFkYXRhICU+JQogIHVubmVzdF90b2tlbnMod29yZCwgYWJzdHJhY3QsIHRvX2xvd2VyID0gVFJVRSkgJT4lCiAgYW50aV9qb2luKHRpZHl0ZXh0OjpzdG9wX3dvcmRzLCBieSA9ICJ3b3JkIikgJT4lCiAgc2VsZWN0KGRvaSwgd29yZCkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkgJT4lCiAgZmlsdGVyKG4gPiA2NTApICU+JQogIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBuKSkgJT4lCiAgZ2dwbG90KGFlcyhuLCB3b3JkKSkgKwogIGdlb21fY29sKCkgKwogIGxhYnMoCiAgICB5ID0gTlVMTCwKICAgIHRpdGxlID0gIk1haW4gdGhlbWVzIGluIHRoZSBhYnN0cmFjdHMiLAogICAgc3VidGl0bGUgPSAiRHJvcGluZyB1c3VhbCBzdG9wIHdvcmRzIiwKICAgIHggPSAiTnVtYmVyIG9mIGFic3RyYWN0cyBjb250YWluaW5nIHRoaXMgd29yZCIKICApIApgYGAKCiMjIERldGVjdGlvbiBvZiBlZmZlY3RzCgo8IS0tIE5vdCBhbGwgYWJzdHJhY3RzIGRpc3BsYXkgZWZmZWN0cyBhbmQgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFdlIHRodXMgd2FudCB0byBhc3Nlc3Mgd2hldGhlciB0aGVyZSBhcmUgbm90aWNlYWJsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGFydGljbGVzIGZvciB3aGljaCB3ZSByZXRyaWV2ZSBjb25maWRlbmNlIGludGVydmFscyBhbmQgdGhvc2UgZm9yIHdoaWNoIHdlIGRvIG5vdC4gVGhpcyBxdWljayBleHBsb3JhdGlvbiB3aWxsIGFsc28gcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFuZCBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIG9uIHRoZSB3aG9sZSBzZXQgb2YgYXJ0aWNsZXMuIC0tPgoKYGBge3J9CnN0cmluZ19jb25maW50IDwtIHN0cl9jKAogICIoKD88IShcXGRcXC58XFxkKSk5NVxccz8lfCg/PCEoXFxkXFwufFxcZCkpOTVcXHMocGVyKFxccz8pY2VudCl8IiwKICAiXFxiQyhcXC4pPyhJfGwpKFxcLik/KHM/KVxcYnxcXGJQSShzPylcXGJ8XFxiKGl8SSludGVydmFsfCIsCiAgIlxcYihjfEMpb25maWRlbmNlXFxzKGl8SSludGVydmFsfFxcYihjfEMpcmVkaWJsZVxccyhpfEkpbnRlcnZhbHwiLCAKICAiXFxiKHB8UClvc3RlcmlvclxccyhpfEkpbnRlcnZhbCkiCiAgKQoKZWZmZWN0X2RldGVjdGVkIDwtIGFic3RyYWN0c19hbmRfbWV0YWRhdGEgJT4lCiAgbGVmdF9qb2luKGVzdGltYXRlcywgYnkgPSAiZG9pIikgJT4lIAogIG11dGF0ZSgKICAgIGNvbnRhaW5zX0NJID0gc3RyX2RldGVjdChhYnN0cmFjdCwgc3RyaW5nX2NvbmZpbnQpCiAgKSAlPiUKICBncm91cF9ieSh0aXRsZSkgJT4lIAogIG11dGF0ZSgKICAgIGhhc19lZmZlY3QgPSAoc3VtKCFpcy5uYShlZmZlY3QpLCBuYS5ybSA9IFRSVUUpID4gMCksCiAgICBoYXNfZWZmZWN0X3BocmFzZSA9IGlmZWxzZShoYXNfZWZmZWN0LCAiRWZmZWN0IHJldHJpZXZlZCIsICJObyBlZmZlY3QgcmV0cmlldmVkIikKICApICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIHNlbGVjdCgtZWZmZWN0LCAtbG93X0NJLCAtdXBfQ0kpICU+JSAKICBkaXN0aW5jdCgpCmBgYAoKT3V0IG9mIHRoZSBgciBucm93KGFic3RyYWN0c19hbmRfbWV0YWRhdGEpYCB2YWxpZCBhcnRpY2xlcyByZXR1cm5lZCBieSB0aGUgcXVlcnkgb25seSBhIGZyYWN0aW9uIHJlcG9ydHMgZXN0aW1hdGVzIGFuZCBjb25maWRlbmNlIGludGVydmFscyBpbiB0aGVpciBhYnN0cmFjdHMuIFdlIHRoZXJlZm9yZSBkbyBub3QgcmV0cmlldmUgZWZmZWN0cyBmb3IgYWxsIHRoZSBhcnRpY2xlcyByZXR1cm5lZCBieSB0aGUgcXVlcnksIG1vc3RseSBmb3IgdGhlIHJlYXNvbiBhZm9yZW1lbnRpb25lZC4gVGhpcyBtaWdodCBjcmVhdGUgc29tZSBzZWxlY3Rpb24sIG1ha2luZyB0aGUgc2FtcGxlIG9mIGFydGljbGVzIHN0dWRpZWQgbm90IHJlcHJlc2VudGF0aXZlIG9mIHRoZSB3aG9sZSBsaXRlcmF0dXJlLiBXZSBpbnZlc3RpZ2F0ZSBmdXJ0aGVyIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYXJ0aWNsZXMgdGhhdCBkbyBhbmQgZG8gbm90IHJlcG9ydCBjb25maWRlbmNlIGludGVydmFscyBpbiB0aGVpciBhYnN0cmFjdHMgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9uLiAKCkhlcmUgaXMgYSBsaXN0IG9mIHRoZSB2YWxpZCBhcnRpY2xlcy4gVGhlIGxhc3QgY29sdW1uIHNob3dzIHdoZXRoZXIgYXQgbGVhc3Qgb25lIGVmZmVjdCB3YXMgcmV0cmlldmVkIGZvciB0aGlzIGFydGljbGUuCgpgYGB7cn0KZWZmZWN0X2RldGVjdGVkICU+JSAKICBzZWxlY3QoYXV0aG9ycywgcHViX2RhdGUsIHRpdGxlLCBqb3VybmFsLCBoYXNfZWZmZWN0X3BocmFzZSkgJT4lIAogIGRhdGF0YWJsZSgKICAgIGNvbG5hbWVzID0gYygKICAgICAgIkF1dGhvcnMiLCAKICAgICAgIlB1YmxpY2F0aW9uIGRhdGUiLCAKICAgICAgIlRpdGxlIiwgCiAgICAgICJKb3VybmFsIiwgCiAgICAgICJFZmZlY3QgcmV0cmlldmVkIgogICAgKQogICkKYGBgCgpJbiB0b3RhbCwgd2UgKipkZXRlY3QgYHIgbnJvdyhlc3RpbWF0ZXMpYCB2YWxpZCBlZmZlY3RzKiogYW5kIGFzc29jaWF0ZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFdlIHJldHJpZXZlIGVzdGltYXRlcyBmb3IgbW9zdCBvZiB0aGUgYXJ0aWNsZXMgbWVudGlvbmluZyAiQ0kiIGluIHRoZSBhYnN0cmFjdDogIAoKYGBge3J9CmVmZmVjdF9kZXRlY3RlZCAlPiUKICBmaWx0ZXIoY29udGFpbnNfQ0kpICU+JSAKICBjb3VudChoYXNfZWZmZWN0KSAlPiUgCiAgbXV0YXRlKAogICAgcHJvcCA9IG4vc3VtKG4pLAogICAgaGFzX2VmZmVjdCA9IGlmZWxzZShoYXNfZWZmZWN0LCAiWWVzIiwgIk5vIikKICApICU+JSAKICBhcnJhbmdlKGRlc2MoaGFzX2VmZmVjdCkpICU+JSAKICBrYWJsZSgKICAgIGNvbC5uYW1lcyA9IGMoIkVmZmVjdCByZXRyZWl2ZWQiLCAiTnVtYmVyIG9mIGFydGljbGVzIiwgIlByb3BvcnRpb24iKSwKICAgIGNhcHRpb24gPSAiTnVtYmVyIG9mIGFydGljbGVzIGZvciB3aGljaCBhdCBsZWFzdCBvbmUgZWZmZWN0IGlzIHJldHJpZXZlZCAob3V0IG9mIHRob3NlIGNvbnRhaW5pbmcgdGhlIHBocmFzZSAnQ0knKSIKICApCmBgYAoKTm90ZSB0aGF0IGEgYnVuY2ggb2YgYWJzdHJhY3RzIGNvbnRhaW4gdGhlIHBocmFzZSAiQ0kiIHdpdGhvdXQgYWN0dWFsbHkgZGlzcGxheWluZyBlZmZlY3RzIGFuZCBjb25maWRlbmNlIGludGVydmFscy4gT3VyIGFsZ29yaXRobSBzZWVtcyB0byBtYWtlIGEgcmVhc29uYWJseSBnb29kIGpvYiBhdCBkZXRlY3RpbmcgZWZmZWN0cyBhbmQgQ0kgd2hlbiB0aGV5IGFyZSBpbmRlZWQgZGlzcGxheWVkIGluIGFuIGFic3RyYWN0LiBJbiBhZGRpdGlvbiwgdGhlcmUgaXMgbm8gcmVhc29uIHRvIHRoaW5rIHRoYXQgb3VyIGFiaWxpdHkgdG8gZGV0ZWN0IGFuIGVmZmVjdCB3b3VsZCBiZSBjb3JyZWxhdGVkIHdpdGggcG93ZXIgaXNzdWVzIGluIHRoZSBwYXBlci4gSGVuY2UsIHdlIGZlZWwgcmF0aGVyIGNvbmZpZGVudCBhc3N1bWluZyB0aGF0IG91ciBkZXRlY3Rpb24gYWxnb3JpdGhtIHNlbGVjdHMgYSByYW5kb20gKGFsb25nIG91ciBkaW1lbnNpb24gb2YgaW50ZXJlc3QpIHNhbXBsZSBvZiBlc3RpbWF0ZXMgYW1vbmcgYWxsIGVzdGltYXRlcyBkaXNwbGF5ZWQgaW4gYWJzdHJhY3RzLgoKIyMgUmVwcmVzZW50YXRpdml0eSBvZiBhcnRpY2xlcyBmb3Igd2hpY2ggYW4gZWZmZWN0IHdhcyByZXRyaWV2ZWQKCkluIHRoaXMgc3Vic2VjdGlvbiwgd2UgaW52ZXN0aWdhdGUgd2hldGhlciB0aGVyZSBhcmUgc3lzdGVtYXRpYyBkaWZmZXJlbmNlcyBiZXR3ZWVuIGFydGljbGVzIGZvciB3aGljaCB3ZSByZXRyaWV2ZWQgYW4gZWZmZWN0IGFuZCBhcnRpY2xlcyB0aGF0IGRvIG5vdCBkaXNwbGF5IGFuIGVmZmVjdCBpbiB0aGVpciBhYnN0cmFjdCBvciBmb3Igd2hpY2ggd2UgZGlkIG5vdCBkZXRlY3Qgb25lLiBXZSBidWlsZCB0aGlzIGFuYWx5c2lzIHN1Y2ggdGhhdCBpdCBhbHNvIHByb3ZpZGVzIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVudGlyZSBzZXQgb2YgYXJ0aWNsZXMuIAoKIyMjIFF1YWxpdGF0aXZlIHJhbmRvbSBhbmFseXNpcwoKRmlyc3Qgb2YgYWxsLCB3ZSBza2ltIHRocm91Z2ggYSBidW5jaCBvZiBhYnN0cmFjdHMgZm9yIHdoaWNoIHdlIHJldHJpZXZlIGFuIGVmZmVjdCBvciBub3QgdG8gc2VlIHdoZXRoZXIgdGhlcmUgYXJlIGNsZWFyIGRpZmZlcmVuY2VzIGFjcm9zcyBzdHVkeSBzdWJzZXRzLiBXZSBub3RpY2UgdGhhdAoKCjwhLS0gYGBge3J9IC0tPgo8IS0tIGVmZmVjdF9kZXRlY3RlZCAlPiUgIC0tPgo8IS0tICAgZmlsdGVyKGhhc19lZmZlY3QpICU+JSAgLS0+CjwhLS0gICBzbGljZV9zYW1wbGUobiA9IDMpICU+JSAgLS0+CjwhLS0gICAuJGFic3RyYWN0ICU+JSAgLS0+CjwhLS0gICBzdHJfdmlld19hbGwoIn4iKSAtLT4KPCEtLSBgYGAgLS0+CgoKIyMjIFB1YmxpY2F0aW9uIGRhdGUKCldlIGZpcnN0IGxvb2sgaW50byB0aGUgZGlzdHJpYnV0aW9uIG9mIHB1Ymxpc2hlZCBhcnRpY2xlcyBvbiB0aGlzIHRvcGljIGluIHRpbWUuIFdlIHRoZW4gd29uZGVyIHdoZXRoZXIgZGlzcGxheWluZyBlZmZlY3RzIGluIHRoZSBhYnN0cmFjdCB3YXMgYSBwYXJ0aWN1bGFyIGZlYXR1cmUgb2YgYSBnaXZlbiBwZXJpb2QuCgpgYGB7cn0KZWZmZWN0X2RldGVjdGVkICU+JSAKICAjIGZpbHRlcihjb250YWluc19DSSkgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSB5ZWFyKHB1Yl9kYXRlKSwgZmlsbCA9IGhhc19lZmZlY3RfcGhyYXNlLCBjb2xvciA9IGhhc19lZmZlY3RfcGhyYXNlKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgcHVibGljYXRpb24geWVhciIsCiAgICBzdWJ0aXRsZSA9ICJDb21wYXJpc29uIGJldHdlZW4gYXJ0aWNsZXMgZm9yIHdoaWNoIGFuIGVmZmVjdCBpcyByZXRyaWV2ZWQgYW5kIG5vdCIsCiAgICB4ID0gIlB1YmxpY2F0aW9uIHllYXIiLAogICAgeSA9ICJEZW5zaXR5IgogICkgKyAKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWUgPSAiIikKCnllYXJfZmlyc3RfYXJ0aWNsZSA8LSBlZmZlY3RfZGV0ZWN0ZWQgJT4lIAogIGZpbHRlcihoYXNfZWZmZWN0KSAlPiUgCiAgLiRwdWJfZGF0ZSAlPiUgCiAgeWVhcigpICU+JSAKICBtaW4obmEucm0gPSBUUlVFKQpgYGAKCkZpcnN0LCB3ZSBub3RpY2UgdGhhdCB0aGUgbnVtYmVyIG9mIGFydGljbGVzIHB1Ymxpc2hlZCBvbiBzaG9ydC10ZXJtIGhlYWx0aCBlZmZlY3RzIG9mIGFpciBwb2xsdXRpb24gaGFzIGJlZW4gaW5jcmVhc2luZyByYXRoZXIgc3Ryb25nbHkgc2luY2UgdGhlIDE5ODBzLiBUaGUgZmlyc3QgYXJ0aWNsZSBmb3Igd2hpY2ggYW4gZWZmZWN0IGlzIGRldGVjdGVkIHdhcyBwdWJsaXNoZWQgaW4gYHIgeWVhcl9maXJzdF9hcnRpY2xlYC4gV2Ugb25seSBmb3VuZCBgciBlZmZlY3RfZGV0ZWN0ZWQgJT4lIGZpbHRlcih5ZWFyKHB1Yl9kYXRlKSA8IHllYXJfZmlyc3RfYXJ0aWNsZSkgJT4lIGNvdW50KCkgJT4lIC4kbmAgYXJ0aWNsZXMgcHVibGlzaGVkIGJlZm9yZSBgciB5ZWFyX2ZpcnN0X2FydGljbGVgLiBUaGlzIGNhbiBiZSBleHBsYWluZWQgYnkgdGhlIGZhY3QgdGhhdCwgaW4gbW9zdCBwbGFjZXMsIGFpciBwb2xsdXRpb24gaGFzIG9ubHkgYmVlbiBtZWFzdXJlZCBjb25zaXN0ZW50bHkgc2luY2UgdGhlIDE5OTBzLgoKRXZlbiB0aG91Z2ggdGhlcmUgYXJlIHNsaWdodGx5IG1vcmUgcmVjZW50ICgyMDEwLTIwMjApIGFydGljbGVzIGZvciB3aGljaCBlZmZlY3RzIGFyZSByZXRyaWV2ZWQsIHRoZSBkaWZmZXJlbmNlIGRvZXMgbm90IHNlZW0gdG8gYmUgc3Vic3RhbnRpYWwuIERpc3RyaWJ1dGlvbnMgb2YgYXJ0aWNsZXMgZm9yIHdoaWNoIGFuIGVmZmVjdCBoYXMgYmVlbiByZXRyaWV2ZWQgYW5kIG5vdCBhcmUgcmF0aGVyIHNpbWlsYXIuCgojIyMgSm91cm5hbCBhbmQgZmllbGRzCgpXZSB0aGVuIGxvb2sgaW50byB0aGUgam91cm5hbHMgYW5kIGFjYWRlbWljIGZpZWxkcyBpbiB3aGljaCBhcnRpY2xlcyBvbiBzaG9ydCB0ZXJtIGhlYWx0aCBlZmZlY3Qgb2YgYWlyIHBvbGx1dGlvbiBoYXZlIGJlZW4gcHVibGlzaGVkLiBUaGUgcmVzdWx0cyBieSBqb3VybmFscyBhcmUgcmF0aGVyIG1lc3N5IHNvIHdlIGZvY3VzIG9uIGpvdXJuYWwgYXJlYXMgYW5kIHN1YmFyZWFzLiAKCmBgYHtyIGZpZy5hc3A9MX0KZWZmZWN0X2RldGVjdGVkICU+JSAKICBtdXRhdGUoCiAgICBzdWJqZWN0X2FyZWEgPSBpZmVsc2UoCiAgICAgIGlzLm5hKHN1YmplY3RfYXJlYSksIAogICAgICAiU3ViamVjdCB1bmtub3duIiwgCiAgICAgIHN1YmplY3RfYXJlYQogICAgKQogICkgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX2JhcihhZXMoeSA9IGZjdF9yZXYoZmN0X2luZnJlcShzdWJqZWN0X2FyZWEpKSwgZmlsbCA9IGhhc19lZmZlY3RfcGhyYXNlKSkgKwogIGxhYnMoCiAgICB4ID0gIk51bWJlciBvZiBhcnRpY2xlcyBwdWJsaXNoZWQgaW4gam91cm5hbHMgZnJvbSBlYWNoIHN1YmplY3QiLAogICAgeSA9IE5VTEwsCiAgICB0aXRsZSA9ICJKb3VybmFscyBzdWJqZWN0cyBpbiB3aGljaCBhcnRpY2xlcyBoYXZlIGJlZW4gcHVibGlzaGVkIiwKICAgIHN1YnRpdGxlID0gIkNvbXBhcmlzb24gYmV0d2VlbiBhcnRpY2xlcyBmb3Igd2hpY2ggYW4gZWZmZWN0IGlzIHJldHJpZXZlZCBhbmQgbm90IgogICkgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZSA9ICIiKSAKCmVmZmVjdF9kZXRlY3RlZCAlPiUgIAogIHVubmVzdChzdWJzdWJqZWN0X2FyZWEpICU+JSAKICBtdXRhdGUoCiAgICBzdWJzdWJqZWN0X2FyZWEgPSBpZmVsc2UoCiAgICAgIGlzLm5hKHN1YnN1YmplY3RfYXJlYSksIAogICAgICAiU3Vic3ViamVjdCB1bmtub3duIiwgCiAgICAgIHN1YnN1YmplY3RfYXJlYQogICAgKQogICkgJT4lIAogIG11dGF0ZShzdWJzdWJqZWN0X2FyZWEgPSBmY3RfbHVtcF9uKHN1YnN1YmplY3RfYXJlYSwgMjApKSAlPiUKICBmaWx0ZXIoc3Vic3ViamVjdF9hcmVhICE9ICJPdGhlciIpICU+JQogIGdncGxvdCgpICsKICBnZW9tX2JhcihhZXMoeSA9IGZjdF9yZXYoZmN0X2luZnJlcShzdWJzdWJqZWN0X2FyZWEpKSwgZmlsbCA9IGhhc19lZmZlY3RfcGhyYXNlKSkgKwogIGxhYnMoCiAgICB4ID0gIk51bWJlciBvZiBhcnRpY2xlcyBwdWJsaXNoZWQgaW4gam91cm5hbHMgY292ZXJpbmcgYSBnaXZlbiBzdWJzdWJqZWN0IiwKICAgIHkgPSBOVUxMLAogICAgdGl0bGUgPSAiTWFpbiBqb3VybmFscyBzdWJzdWJqZWN0cyBpbiB3aGljaCBhcnRpY2xlcyBoYXZlIGJlZW4gcHVibGlzaGVkIiwKICAgIHN1YnRpdGxlID0gIkNvbXBhcmlzb24gYmV0d2VlbiBhcnRpY2xlcyBmb3Igd2hpY2ggYW4gZWZmZWN0IGlzIHJldHJpZXZlZCBhbmQgbm90IiwKICAgIGNhcHRpb24gPSAiQSBwYXBlciBwdWJsc2loZWQgaW4gYSBtdWx0aS1zdWJqZWN0IGpvdXJuYWwgd2lsbCBhcHBlYXIgc2V2ZXJhbCB0aW1lcyIKICApICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWUgPSAiIikgCmBgYAoKTW9zdCBwYXBlcnMgb24gdGhpcyB0b3BpYyBoYXZlIGJlZW4sIHVuc3VycHJpc2luZ2x5LCBwdWJsaXNoZWQgaW4gbXVsdGlkaXNjaXBsaW5hcnkgam91cm5hbHMsIGhlYWx0aCBvciBwaHlzaWNhbCBzY2llbmNlIGpvdXJuYWxzLgoKT25lIG1heSBub3RpY2UgdGhhdCBlZmZlY3RzIGFyZSBub3QgcmV0cmlldmVkLCAqaWUqIG5vdCByZXBvcnRlZCBpbiB0aGUgYWJzdHJhY3Qgb3Igbm90IGRldGVjdGVkLCBmb3IgbW9zdCBwYXBlcnMgcHVibGlzaGVkIGluIGxpZmUgc2NpZW5jZSBhbmQgc29jaWFsIHNjaWVuY2VzIGFuZCBodW1hbml0aWVzLiBUaGlzIG1pZ2h0IG5vdCBiZSBhcyBwcm9ibGVtYXRpYyBhcyB0aGV5IGNvbnN0aXR1dGUgYSBzbWFsbCBzaGFyZSBvZiB0aGUgc2FtcGxlLiBUaGVyZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGEgcGFydGljdWxhcmx5IGxhcmdlIGltYmFsYW5jZSBpbiB0ZXJtcyBvZiBqb3VybmFsIGdlbmVyYWwgZmllbGQgZm9yIHRoZSBtb3JlIHJlcHJlc2VudGVkIGZpZWxkcy4KCiMjIyBUaGVtZXMKCldlIHRoZW4gd29uZGVyIGlmIHRoZSB3b3JkcyB1c2VkIGluIGVhY2ggc2V0cyBvZiBhYnN0cmFjdHMgZGlmZmVyIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIGFydGljbGVzLgoKYGBge3IgZmlnLmFzcD0xfQp0aGVtZV9lZmZlY3QgPC0gZWZmZWN0X2RldGVjdGVkICU+JQogIHVubmVzdF90b2tlbnMod29yZCwgYWJzdHJhY3QsIHRvX2xvd2VyID0gVFJVRSkgJT4lIAogIGFudGlfam9pbih0aWR5dGV4dDo6c3RvcF93b3JkcywgYnkgPSAid29yZCIpICU+JSAKICBncm91cF9ieSh3b3JkLCBoYXNfZWZmZWN0KSAlPiUKICBtdXRhdGUobl9hcnRpY2xlc193b3JkID0gbGVuZ3RoKHVuaXF1ZShkb2kpKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgc2VsZWN0KHdvcmQsIGhhc19lZmZlY3QsIGhhc19lZmZlY3RfcGhyYXNlLCBuX2FydGljbGVzX3dvcmQpICU+JSAKICBkaXN0aW5jdCgpICU+JSAKICBncm91cF9ieSh3b3JkKSAlPiUgCiAgbXV0YXRlKHRvdF9uX2FydGljbGVzX3dvcmQgPSBzdW0obl9hcnRpY2xlc193b3JkLCBuYS5ybSA9IFRSVUUpKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBmaWx0ZXIodG90X25fYXJ0aWNsZXNfd29yZCA+IDYwMCkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgIyBtdXRhdGUoaGFzX2VmZmVjdCA9IGlmZWxzZShoYXNfZWZmZWN0LCAiRWZmZWN0IGRldGVjdGVkIiwgIkVmZmVjdCBub3QgZGV0ZWN0ZWQiKSkgJT4lIAogIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBuX2FydGljbGVzX3dvcmQpKSAKCnRoZW1lX2VmZmVjdCAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gd29yZCwgZmlsbCA9IGhhc19lZmZlY3RfcGhyYXNlKSkgKwogIGdlb21fY29sKAogICAgZGF0YSA9IHN1YnNldCh0aGVtZV9lZmZlY3QsIGhhc19lZmZlY3QpLCAKICAgIGFlcyh5ID0gbl9hcnRpY2xlc193b3JkKQogICkgKwogIGdlb21fY29sKAogICAgZGF0YSA9IHN1YnNldCh0aGVtZV9lZmZlY3QsICFoYXNfZWZmZWN0KSwKICAgIGFlcyh5ID0gLW5fYXJ0aWNsZXNfd29yZCksCiAgICBwb3NpdGlvbiA9ICJpZGVudGl0eSIKICApICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gYWJzKSArCiAgY29vcmRfZmxpcCgpICsKICBsYWJzKAogICAgeCA9IE5VTEwsCiAgICB5ID0gIk51bWJlciBvZiBhYnN0cmFjdHMgY29udGFpbmluZyBhIGdpdmVuIHdvcmQiLAogICAgdGl0bGUgPSAiV29yZHMgYXBwZWFyaW5nIGluIHRoZSBtb3JlIGFic3RyYWN0cyIsCiAgICBzdWJ0aXRsZSA9ICJDb21wYXJpc29uIGJldHdlZW4gYXJ0aWNsZXMgd2l0aCBhbmQgd2l0aG91dCBkZXRlY3RlZCBlZmZlY3QiCiAgKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lID0gIiIpCmBgYAoKQXBhcnQgZnJvbSBhIGZldyBrZXkgdGVybXMsIHN1Y2ggYXMgQ0ksIDk1IGZvciBpbnN0YW5jZSwgdGhlcmUgYXJlIG5vIGh1Z2UgZGlmZmVyZW5jZXMgaW4gdGhlIHRlcm1zIHVzZWQgaW4gYm90aCBzdWJzZXRzIG9mIGFic3RyYWN0cy4gCgojIyMgUG9sbHV0YW50CgpXZSB0YWtlIGxvb2sgYXQgdGhlIHBvbGx1dGFudHMgY29uc2lkZXJlZCBpbiBlYWNoIGFydGljbGUuIFdlIGNvbnNpZGVyIHRoYXQgYSBwb2xsdXRhbnQgaXMgc3R1ZGllZCBpZiBpdCBpcyBtZW50aW9uZWQgaW4gdGhlIGFic3RyYWN0LiBJdCBpcyBub3QgYW4gZXhhY3QgbWVhc3VyZSBhcyBzb21lIGFydGljbGVzIG1heSBtZW50aW9uIHBvbGx1dGFudHMgd2l0aG91dCBhY3R1YWxseSBzdHVkeWluZyB0aGVtIGJ1dCBpdCByZW1haW5zIGFuIGludGVyZXN0aW5nIG1ldHJpYy4KCmBgYHtyIGZpZy5hc3A9MC43fQplZmZlY3RfZGV0ZWN0ZWQgJT4lIAogIHVubmVzdChwb2xsdXRhbnQpICU+JSAKICBtdXRhdGUocG9sbHV0YW50ID0gaWZlbHNlKGlzLm5hKHBvbGx1dGFudCksICJQb2xsdXRhbnQgbm90IGRldGVjdGVkIiwgcG9sbHV0YW50KSkgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX2JhcihhZXMoeSA9IGZjdF9yZXYoZmN0X2luZnJlcShwb2xsdXRhbnQpKSwgZmlsbCA9IGhhc19lZmZlY3RfcGhyYXNlKSkgKwogIGxhYnMoCiAgICB4ID0gIk51bWJlciBvZiBhcnRpY2xlIG1lbnRpb25uaW5nIGVhY2ggcG9sbHV0YW50IiwKICAgIHkgPSBOVUxMLAogICAgdGl0bGUgPSAiTnVtYmVyIG9mIGFydGljbGVzIHN0dWRpbmcgYSBnaXZlbiBwb2xsdXRhbnQiLAogICAgc3VidGl0bGUgPSAiQ29tcGFyaXNvbiBiZXR3ZWVuIGFydGljbGVzIGZvciB3aGljaCBhbiBlZmZlY3Qgd2FzIGRldGVjdGVkIG9yIG5vdCIsCiAgICBjYXB0aW9uID0gIkEgcGFwZXIgbWVudGlvbmluZyBzZXZlcmFsIHBvbGx1dGFudHMgd2lsbCBhcHBlYXIgc2V2ZXJhbCB0aW1lcyIKICApICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWUgPSAiIikKYGBgCkZpcnN0IG9mIGFsbCwgd2Ugbm90aWNlIHRoYXQgYSBsYXJnZSBzaGFyZSBvZiBwYXBlcnMgY29uc2lkZXJlZCBoZXJlIHN0dWR5IHBhcnRpY3VsYXRlIG1hdHRlcnMgKFBNMi41LCBQTTEwIG9yIGJvdGgpLiAKCkl0IHNlZW1zIHRoYXQsIHdoZW4gdGhlcmUgYXJlIGVub3VnaCBhcnRpY2xlcywgdGhlIGxpa2VsaWhvb2Qgb2YgZGV0ZWN0aW5nIGFuIGVmZmVjdCBkb2VzIG5vdCBzZWVtIHRvIHZhcnkgbXVjaCB3aXRoIHRoZSB0eXBlIG9mIHBvbGx1dGFudC4gSW1wb3J0YW50bHksIHRoZSBwcm9wb3J0aW9uIG9mIGVmZmVjdHMgcmV0cmlldmVkIGlzIG11Y2ggbG93ZXIgZm9yIGFydGljbGVzIGZvciB3aGljaCB3ZSBhcmUgbm90IGFibGUgdG8gZGV0ZWN0IHRoZSB0eXBlIG9mIHBvbGx1dGFudHMgc3R1ZGllZC4gCgojIyMgT3V0Y29tZQoKQXMgZm9yIHBvbGx1dGFudHMsIGZvciBzb21lIGFydGljbGVzLCB3ZSB3ZXJlIGFibGUgdG8gcmV0cmlldmUgc3R1ZGllZCBvdXRjb21lcyBkZXBlbmRpbmcgb24gdGhlIHdvcmRzIHVzZWQgaW4gYW4gYWJzdHJhY3QuIFdlIGNsYXNzaWZpZWQgdGhlbSBpbnRvIHR3byBjYXRlZ29yaWVzOiBtb3J0YWxpdHkgYW5kIGVtZXJnZW5jeS4KCmBgYHtyIGZpZy5hc3A9MC43fQplZmZlY3RfZGV0ZWN0ZWQgJT4lIAogIHVubmVzdChvdXRjb21lKSAlPiUgCiAgbXV0YXRlKG91dGNvbWUgPSBpZmVsc2UoaXMubmEob3V0Y29tZSksICJPdXRjb21lIG5vdCBkZXRlY3RlZCIsIG91dGNvbWUpKSAlPiUgCiAgbXV0YXRlKGhhc19lZmZlY3QgPSBpZmVsc2UoaGFzX2VmZmVjdCwgIkVmZmVjdCBkZXRlY3RlZCIsICJFZmZlY3Qgbm90IGRldGVjdGVkIikpICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9iYXIoYWVzKHggPSBvdXRjb21lLCBmaWxsID0gaGFzX2VmZmVjdCksIHBvc2l0aW9uID0gImRvZGdlIikgKwogIGxhYnMoCiAgICB4ID0gTlVMTCwKICAgIHkgPSAiTnVtYmVyIG9mIGFydGljbGVzIiwKICAgIHRpdGxlID0gIk51bWJlciBvZiBhcnRpY2xlcyBzdHVkaW5nIGEgZ2l2ZW4gb3V0Y29tZSIsCiAgICBzdWJ0aXRsZSA9ICJDb21wYXJpc29uIGJldHdlZW4gYXJ0aWNsZXMgZm9yIHdoaWNoIGFuIGVmZmVjdCB3YXMgZGV0ZWN0ZWQgb3Igbm90IC0gYXJ0aWNsZXMgd2l0aCB1bmtub3duIG91dGNvbWVzIGRyb3BwZWQiCiAgKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lID0gIiIpIApgYGAKCk1vc3QgYXJ0aWNsZXMgc3R1ZGllZCBoZXJlIGFyZSBpbnRlcmVzdGVkIGluIG1vcnRhbGl0eS4gVGhlIHByb3BvcnRpb24gb2YgYXJ0aWNsZXMgZm9yIHdoaWNoIGFuIGVmZmVjdCBpcyByZXRyaWV2ZWQgc2VlbXMgdG8gYmUgbGFyZ2VyIGZvciBwYXBlcnMgc3R1ZHlpbmcgZW1lcmdlbmN5IGFkbWlzc2lvbnMgdGhhbiBtb3J0YWxpdHkuIAoKIyMjIFN1YnBvcHVsYXRpb24KClNvbWUgYXJ0aWNsZXMgZm9jdXMgb24gc3ViLXBvcHVsYXRpb25zIHN1Y2ggYXMgaW5mYW50cyBvciBlbGRlcmx5LiBXZSBhcmUgYWJsZSB0byBkZXRlY3QgYSBmcmFjdGlvbiBvZiB0aGVzZSBhcnRpY2xlcywgd2hlbiB0aGVzZSB0ZXJtcyBhcmUgbWVudGlvbmVkIGluIHRoZSBhYnN0cmFjdC4gV2hlbiB0aGVzZSB0ZXJtcyBhcmUgbm90IG1lbnRpb25lZCwgZWl0aGVyIHRoZSBlbnRpcmUgcG9wdWxhdGlvbiBpcyBjb25zaWRlcmVkIG9yIHdlIGFyZSBub3QgYWJsZSB0byBkZXRlY3QgdGhlIHN1Ymdyb3VwIGNvbnNpZGVyZWQuIFRoZSBudW1iZXIgb2YgYXJ0aWNsZXMgZm9yIHdoaWNoIGEgc3VicG9wdWxhdGlvbiBpcyBpbmRpY2F0ZWQgaXMgcmF0aGVyIHNtYWxsOiAKCmBgYHtyfQplZmZlY3RfZGV0ZWN0ZWQgJT4lIAogIHVubmVzdChzdWJwb3ApICU+JSAKICBncm91cF9ieShkb2kpICU+JSAKICBtdXRhdGUobWlzc2luZ19zdWJwb3AgPSBpcy5uYShzdWJwb3ApKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBzZWxlY3QoZG9pLCBtaXNzaW5nX3N1YnBvcCkgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIGNvdW50KG1pc3Npbmdfc3VicG9wID0gbWlzc2luZ19zdWJwb3ApICU+JQogIG11dGF0ZShtaXNzaW5nX3N1YnBvcCA9IGlmZWxzZShtaXNzaW5nX3N1YnBvcCwgIk5vIG9yIHVua25vd24iLCAiWWVzIikpICU+JSAKICBrYWJsZShjb2wubmFtZXMgPSBjKCJTdWJwb3B1bGF0aW9uIGluZGljYXRlZCIsICJOdW1iZXIgb2YgYXJ0aWNsZXMiKSkKYGBgCgpMb29raW5nIG1vcmUgaW4gZGV0YWlscyBpbnRvIHRoZSBkZXRlY3Rpb24gb2YgZWZmZWN0cywgd2UgZ2V0IHRoZSBmb2xsb3dpbmcgcGF0dGVybjoKCmBgYHtyIGZpZy5hc3A9MC43fQplZmZlY3RfZGV0ZWN0ZWQgJT4lIAogIHVubmVzdChzdWJwb3ApICU+JSAKICBtdXRhdGUoc3VicG9wID0gaWZlbHNlKGlzLm5hKHN1YnBvcCksICJObyBzdWJwb3B1bGF0aW9uIG5vdCBkZXRlY3RlZCIsIHN1YnBvcCkpICU+JSAKICBtdXRhdGUoaGFzX2VmZmVjdCA9IGlmZWxzZShoYXNfZWZmZWN0LCAiRWZmZWN0IGRldGVjdGVkIiwgIkVmZmVjdCBub3QgZGV0ZWN0ZWQiKSkgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX2JhcihhZXMoeCA9IHN1YnBvcCwgZmlsbCA9IGhhc19lZmZlY3QpLCBwb3NpdGlvbiA9ICJmaWxsIikgKwogIGxhYnMoCiAgICB4ID0gTlVMTCwKICAgIHkgPSAiUHJvcG9ydGlvbiBvZiBhcnRpY2xlcyIsCiAgICB0aXRsZSA9ICJQcm9wb3J0aW9uIG9mIGFydGljbGVzIHN0dWRpbmcgYSBnaXZlbiBvdXRjb21lIiwKICAgIHN1YnRpdGxlID0gIkNvbXBhcmlzb24gYmV0d2VlbiBhcnRpY2xlcyBmb3Igd2hpY2ggYW4gZWZmZWN0IHdhcyBkZXRlY3RlZCBvciBub3QgLSBhcnRpY2xlcyB3aXRoIHVua25vd24gb3V0Y29tZXMgZHJvcHBlZCIKICApICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWUgPSAiIikgCmBgYApUaGVyZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGxhcmdlIHZhcmlhdGlvbnMgaW4gdGhlIHByb3BvcnRpb24gb2YgYXJ0aWNsZXMgZm9yIHdoaWNoIGFuIGVmZmVjdCBpcyBkZXRlY3RlZCwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgYSBzdWJwb3B1bGF0aW9uIGlzIHN0dWRpZWQgb3Igbm90LiBZZXQsIHRoaXMgcHJvcG9ydGlvbiBpcyBhIHNsaWdodGx5IGxhcmdlciBmb3IgZWxkZXJzIHRoYW4gaW5mYW50cywgaXRzZWxmIGxhcmdlciB0aGFuIHdoZW4gd2hlbiBubyBzdWJwb3B1bGF0aW9uIGlzIGRldGVjdGVkLgoKIyMjIE51bWJlciBvZiBvYnNlcnZhdGlvbnMKCldlIHRoZW4gbG9vayBhdCB0aGUgbnVtYmVyIG9mIG9ic2VydmF0aW9ucywgdGhlIGxlbmd0aCBvZiB0aGUgdGhlIHN0dWR5IHBlcmlvZCBhbmQgdGhlIG51bWJlciBvZiBjaXRpZXMgY29uc2lkZXJlZC4gSW1wb3J0YW50bHksIHdlIG9ubHkgcmV0cmlldmUgdGhpcyBpbmZvcm1hdGlvbiBmb3IgYSB2ZXJ5IGxpbWl0ZWQgc3Vic2V0IG9mIGFydGljbGVzLiAKCmBgYHtyfQpsZW4gPC0gZWZmZWN0X2RldGVjdGVkICU+JSAKICBjb3VudChNaXNzaW5nID0gaXMubmEobGVuZ3RoX3N0dWR5KSkgJT4lIAogIHJlbmFtZShgTGVuZ3RoIG9mIHRoZSBzdHVkeWAgPSBuKQoKY2l0aWVzIDwtIGVmZmVjdF9kZXRlY3RlZCAlPiUgCiAgY291bnQoTWlzc2luZyA9IGlzLm5hKG5fY2l0aWVzKSkgJT4lIAogIHJlbmFtZShgTnVtYmVyIG9mIGNpdGllc2AgPSBuKQoKb2JzIDwtIGVmZmVjdF9kZXRlY3RlZCAlPiUgCiAgY291bnQoTWlzc2luZyA9IGlzLm5hKG5fb2JzKSkgJT4lIAogIHJlbmFtZShgTnVtYmVyIG9mIG9ic2VydmF0aW9uc2AgPSBuKQoKbGVuICU+JSAKICBmdWxsX2pvaW4oY2l0aWVzKSAlPiUgCiAgZnVsbF9qb2luKG9icykgJT4lIAogIG11dGF0ZShNaXNzaW5nID0gc3RyX3RvX3RpdGxlKE1pc3NpbmcpKSAlPiUgCiAga2FibGUoKQpgYGAKCk91ciBhbmFseXNpcyBpcyB0aGVyZWZvcmUgdG8gYmUgdGFrZW4gd2l0aCBjYXV0aW9uIGFzIHRoZXJlIGlzIGEgY3JpdGljYWwgbGFjayBvZiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjYXRlZ29yeS4KCmBgYHtyIGZpZy5hc3A9MC43fQplZmZlY3RfZGV0ZWN0ZWQgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSBuX29icywgZmlsbCA9IGhhc19lZmZlY3RfcGhyYXNlLCBjb2xvciA9IGhhc19lZmZlY3RfcGhyYXNlKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgdGhlIG51bWJlciBvZiBvYnNlcnZhdGlvbnMiLAogICAgc3VidGl0bGUgPSAiQ29tcGFyaXNvbiBiZXR3ZWVuIGFydGljbGVzIGZvciB3aGljaCBhbiBlZmZlY3QgaXMgcmV0cmlldmVkIGFuZCBub3QiLAogICAgeCA9ICJFc3RpbWF0ZWQgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyIsCiAgICB5ID0gIkRlbnNpdHkiCiAgKSArIAogIHNjYWxlX3hfbG9nMTAoKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lID0gIiIpCgplZmZlY3RfZGV0ZWN0ZWQgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSBsZW5ndGhfc3R1ZHksIGZpbGwgPSBoYXNfZWZmZWN0X3BocmFzZSwgY29sb3IgPSBoYXNfZWZmZWN0X3BocmFzZSkpICsKICBsYWJzKAogICAgdGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIHRoZSBsZW5ndGggb2YgdGhlIHN0dWR5IiwKICAgIHN1YnRpdGxlID0gIkNvbXBhcmlzb24gYmV0d2VlbiBhcnRpY2xlcyBmb3Igd2hpY2ggYW4gZWZmZWN0IGlzIHJldHJpZXZlZCBhbmQgbm90IiwKICAgIHggPSAiRXN0aW1hdGVkIGxlbmd0aCBvZiB0aGUgc3R1ZHkgKGluIGRheXMpIiwKICAgIHkgPSAiRGVuc2l0eSIKICApICsgCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lID0gIiIpCgplZmZlY3RfZGV0ZWN0ZWQgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSBuX2NpdGllcywgZmlsbCA9IGhhc19lZmZlY3RfcGhyYXNlLCBjb2xvciA9IGhhc19lZmZlY3RfcGhyYXNlKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgdGhlIG51bWJlciBvZiBjaXRpZXMgaW4gdGhlIHN0dWR5IiwKICAgIHN1YnRpdGxlID0gIkNvbXBhcmlzb24gYmV0d2VlbiBhcnRpY2xlcyBmb3Igd2hpY2ggYW4gZWZmZWN0IGlzIHJldHJpZXZlZCBhbmQgbm90IiwKICAgIHggPSAiRXN0aW1hdGVkIG51bWJlciBvZiBjaXRpZXMiLAogICAgeSA9ICJEZW5zaXR5IgogICkgKyAKICBzY2FsZV94X2xvZzEwKCkgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZSA9ICIiKQpgYGAKCldlIG5vdGljZSB0aGF0IHRoZXJlIGFyZSBsYXJnZSB2YXJpYXRpb25zIGluIHRoZSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIGluIHRoZSBzdHVkaWVzIGNvbnNpZGVyZWQuIEhvd2V2ZXIsIHRoZXJlIGRvZXMgbm90IHNlZW0gdG8gYmUgbGFyZ2UgZGlmZmVyZW5jZXMgYWxvbmcgdGhpcyBkaW1lbnNpb24gb24gd2hldGhlciBhbiBlZmZlY3QgaXMgcmV0cmlldmVkIG9yIG5vdC4gVGhlcmUgc2VlbXMgaG93ZXZlciB0byBiZSBtb3JlIHN0dWRpZXMgYXJvdW5kIDEwMDAgb2JzZXJ2YXRpb24gYW5kIGxlc3MgYmV0d2VlbiAxMCwwMDAgYW5kIDEwMCwwMDAgaW4gYXJ0aWNsZXMgZm9yIHdoaWNoIGFuIGVmZmVjdCBpcyByZXRyaWV2ZWQKCk5vdyB0aGF0IHdlIGhhdmUgcXVpY2tseSBjb21wYXJlZCB0aGUgYXJ0aWNsZXMgZm9yIHdoaWNoIHdlIHJldHJpZXZlIGFuIGVmZmVjdCBhbiB0aG9zZSBmb3Igd2hpY2ggd2UgZG8gbm90LCB3ZSBjYW4gZGlnIGZ1cnRoZXIgaW50byB0aGUgYW5hbHlzaXMgb2YgdGhlIGVzdGltYXRlcyByZXRyaWV2ZWQuCgojIEFuYWx5c2lzIG9mIHRoZSBlZmZlY3RzCgpJbiB0aGlzIHNlY3Rpb24sIHdlIGJyaWVmbHkgYW5hbHl6ZSB0aGUgZWZmZWN0cyByZXRyaWV2ZWQuIEZpcnN0LCB3ZSBsb29rIGludG8gdGhlIHByb3BvcnRpb24gb2Ygc2lnbmlmaWNhbnQgZWZmZWN0cy4KCmBgYHtyfQplc3RpbWF0ZXNfc3RhdHMgPC0gZXN0aW1hdGVzICU+JQogIGZpbHRlcighaXMubmEoZWZmZWN0KSkgJT4lIAogIG11dGF0ZSgKICAgIHNpZ25pZmljYW50ID0gKGxvd19DSSA+IDAgfCB1cF9DSSA8IDApLCAKICAgIHNpZ25hbF9ub2lzZSA9IGFicyhlZmZlY3QvKHVwX0NJIC0gbG93X0NJKSksCiAgICBzZSA9IGFicyh1cF9DSSAtIGxvd19DSSkvKDIqMS45NiksIAogICAgdF9zY29yZSA9IGFicyhlZmZlY3QpL3NlCiAgKSAKCmVzdGltYXRlc19zdGF0cyAlPiUgCiAgY291bnQoc2lnbmlmaWNhbnQpICU+JSAKICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKSAlPiUgCiAgbXV0YXRlKHNpZ25pZmljYW50ID0gaWZlbHNlKHNpZ25pZmljYW50LCAiWWVzIiwgIk5vIikpICU+JSAKICBrYWJsZShjb2wubmFtZXMgPSBjKCJTaWduaWZpY2FudCIsICJOdW1iZXIgb2YgZWZmZWN0cyIsICJQcm9wb3J0aW9uIikpCmBgYAoKTW9zdCBvZiB0aGUgZWZmZWN0cyByZXRyaWV2ZWQgaGVyZSBhcmUgc2lnbmlmaWNhbnQuIFJlc2VhcmNoIG1lbnRpb24gdGhlaXIga2V5IGZpbmRpbmdzIGluIHRoZSBhYnN0cmFjdCBhbmQgdGhlcmVmb3JlIHByb2JhYmx5IGRvIG5vdCByZXBvcnQgbm9uIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZXN0aW1hdGVzIGZvciB3aGljaCB0aGUgbnVsbCBoeXBvdGhlc2lzIG9mIG5vIGVmZmVjdCBjYW5ub3QgYmUgcmVqZWN0ZWQuIE9ubHkgYSB2ZXJ5IHNtYWxsIHByb3BvcnRpb24gb2YgYXJ0aWNsZXMgZG8gbm90IHJlcG9ydCBhbnkgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBlc3RpbWF0ZXMgaW4gdGhlaXIgYWJzdHJhY3Q6CgpgYGB7cn0KZXN0aW1hdGVzX3N0YXRzICU+JSAKICBncm91cF9ieShkb2kpICU+JSAKICBtdXRhdGUoaGFzX3NpZ25pZmljYW50ID0gKHN1bShzaWduaWZpY2FudCkgPiAwKSApICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIHNlbGVjdChoYXNfc2lnbmlmaWNhbnQsIGRvaSkgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIGNvdW50KGhhc19zaWduaWZpY2FudCkgJT4lIAogIG11dGF0ZShwcm9wID0gbi9zdW0obikpICU+JSAKICBtdXRhdGUoaGFzX3NpZ25pZmljYW50ID0gaWZlbHNlKGhhc19zaWduaWZpY2FudCwgIlllcyIsICJObyIpKSAlPiUgCiAga2FibGUoY29sLm5hbWVzID0gYygiQXQgbGVhc3Qgb25lIHNpZ25pZmljYW50IGVzdGltYXRlIiwgIk51bWJlciBvZiBhcnRpY2xlcyIsICJQcm9wb3J0aW9uIikpCmBgYAoKCldlIHRoZW4gbG9vayBpbnRvIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHQtc2NvcmVzLiAKCmBgYHtyfQplc3RpbWF0ZXNfc3RhdHMgJT4lCiAgZmlsdGVyKHRfc2NvcmUgPCAxMCkgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21faGlzdG9ncmFtKGFlcyh4ID0gdF9zY29yZSksIGJpbnMgPSA1MCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEuOTYpICsKICBsYWJzKAogICAgdGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIHRoZSB0LXNjb3JlIGluIGVzdGltYXRlcyBvZiB0aGUgbGl0ZXJhdHVyZSIsCiAgICBzdWJ0aXRsZSA9ICJPbmx5IGNvbnNpZGVyaW5nIG9ic2VydmF0aW9ucyB3aXRoIGEgdC1zY29yZSBsb3dlciB0aGFuIDEwIiwKICAgIGNhcHRpb24gPSAiVGhlIHZlcnRpY2FsIGxpbmUgcmVwcmVzZW50cyB0aGUgdXN1YWwgMS45NiB0aHJlc2hvbGQiLAogICAgeCA9ICJ0LXNjb3JlIiwKICAgIHkgPSAiQ291bnQiCiAgKSAKYGBgCgpUaGVyZSBzZWVtcyB0byBiZSBzb21lIHNvcnQgb2YgYnVuY2hpbmcgZm9yIHQtc2NvcmVzIGFib3ZlIDEuOTYuIEluIHRoaXMgYW5hbHlzaXMsIHdlIG9ubHkgY29uc2lkZXIgZXN0aW1hdGVzIHJlcG9ydGVkIGluIHRoZSBhYnN0cmFjdHMuIEF1dGhvcnMgbWF5IG9ubHkgcmVwb3J0IHNpZ25pZmljYW50IGVzdGltYXRlcyBpbiB0aGVpciBhYnN0cmFjdHMgZXZlbiB0aG91Z2ggdGhleSBhbHNvIHJlcG9ydCBub24gc2lnbmlmaWNhbnQgZXN0aW1hdGVzIGluIHRoZSBib2R5IG9mIHRoZSBhcnRpY2xlLiBUaGlzIG1pZ2h0IGV4cGxhaW4gdGhpcyBidW5jaGluZy4gV2UgbmVlZCB0byBpbnZlc3RpZ2F0ZSB0aGlzIGZ1cnRoZXIgaW4gb3JkZXIgdG8gdW5kZXJzdGFuZCB3aGV0aGVyIHRoaXMgYnVuY2hpbmcgaXMgZXZpZGVuY2Ugb2YgcHVibGljYXRpb24gYmlhcy4gV2UgY291bGQgaW52ZXN0aWdhdGUgdGhpcyBmdXJ0aGVyIGJ5IHJlcHJvZHVjaW5nIHRoZSBwcmVzZW50IGFuYWx5c2lzIGJ1dCBhbmFseXppbmcgdGhlIGZ1bGwgdGV4dHMgYW5kIG5vdCBvbmx5IG9uIHRoZSBhYnN0cmFjdHMuIAogCldlIHRoZW4gcGxvdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBzaWduYWwgdG8gbm9pc2UgcmF0aW8sICppZSogdGhlIHJhdGlvIG9mIHRoZSBwb2ludCBlc3RpbWF0ZSBhbmQgdGhlIHdpZHRoIG9mIHRoZSBjb25maWRlbmNlIGludGVydmFsLgoKYGBge3J9CmVzdGltYXRlc19zdGF0cyAlPiUKICBmaWx0ZXIoc2lnbmFsX25vaXNlIDwgNCkgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21faGlzdG9ncmFtKGFlcyh4ID0gc2lnbmFsX25vaXNlKSwgYmlucyA9IDUwKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMC41KSAgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgdGhlIHNpZ25hbCB0byBub2lzZSByYXRpb24gaW4gZXN0aW1hdGVzIG9mIHRoZSBsaXRlcmF0dXJlIiwKICAgIHN1YnRpdGxlID0gIk9ubHkgY29uc2lkZXJpbmcgb2JzZXJ2YXRpb25zIHdpdGggYSBzaWduYWwgdG8gbm9pc2UgcmF0aW9uIGxvd2VyIHRoYW4gNCIsCiAgICBjYXB0aW9uID0gIlRoZSB2ZXJ0aWNhbCBsaW5lIHJlcHJlc2VudHMgdGhlIHVzdWFsIDAuNSB0aHJlc2hvbGQiLAogICAgeCA9ICJTaWduYWwgdG8gbm9pc2UgcmF0aW9uIiwKICAgIHkgPSAiQ291bnQiCiAgKSAKYGBgCgpUaGUgZ3JhcGggaXMgb2YgY291cnNlIGFuYWxvZ291cyB0byB0aGUgcHJldmlvdXMgb25lLiBJdCBob3dldmVyIGluZm9ybXMgdXMgdGhhdCBpbiBhIGxhcmdlIHNoYXJlIG9mIHRoZSBzdHVkaWVzLCB0aGUgbWFnbml0dWRlIG9mIHRoZSBub2lzZSBpcyBsYXJnZXIgdGhhbiB0aGUgbWFnbml0dWRlIG9mIHRoZSBlZmZlY3QuIExvb2tpbmcgaW4gbW9yZSBkZXRhaWxzIGludG8gdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2lnbmFsIHRvIG5vaXNlIHJhdGlvLCB3ZSBub3RpY2UgdGhhdCBmb3IgNDAlIG9mIHRoZSBlc3RpbWF0ZXMgY29uc2lkZXJlZCBoZXJlLCB0aGUgbWFnbml0dWRlIG9mIHRoZSBub2lzZSBpcyBtb3JlIGltcG9ydGFudCB0aGFuIHRob3NlIG9mIHRoZSBzaWduYWwuCgpgYGB7cn0KcXVhbnRpbGUoZXN0aW1hdGVzX3N0YXRzJHNpZ25hbF9ub2lzZSwgc2VxKDAsIDEsIDAuMSkpICU+JQogIHRpZHkoKSAlPiUKICBzZWxlY3QoeCwgbmFtZXMpICU+JQogIGthYmxlKAogICAgY29sLm5hbWVzID0gYygKICAgICAgIlNpZ25hbCB0byBub2lzZSByYXRpbyIsCiAgICAgICJQZXJjZW50YWdlIG9mIGVzdGltYXRlcyB3aXRoIGEgbG93ZXIgc2lnbmFsIHRvIG5vaXNlIHJhdGlvIgogICAgKQogICkKYGBgCgojIFBvd2VyIGFuYWx5c2lzCgpXZSB0aGVuIHR1cm4gdG8gdGhlIHBvd2VyIGFuYWx5c2lzIGl0c2VsZi4gVGhlIG9iamVjdGl2ZSBpcyB0byBldmFsdWF0ZSB0aGUgcG93ZXIsIHR5cGUgTSBhbmQgdHlwZSBTIGVycm9ycyBmb3IgZWFjaCBlc3RpbWF0ZS4gCgpUbyBjb21wdXRlIHRoZXNlIHZhbHVlcywgd2Ugd291bGQgbmVlZCB0byBrbm93IHRoZSB0cnVlIGVmZmVjdCBzaXplLiBZZXQsIHRydWUgZWZmZWN0cyBhcmUgb2YgY291cnNlIHVua25vd24uIE9uZSBzb2x1dGlvbiBjb3VsZCBiZSB0byB1c2UgZXN0aW1hdGVzIGZyb20gdGhlIGxpdGVyYXR1cmUgYW5kIG1ldGEtYW5hbHlzZXMgYXMgYmVzdCBndWVzc2VzIGZvciB0aGUgdHJ1ZSB2YWx1ZS4gWWV0LCBpbiB0aGUgc2V0dGluZyBvZiB0aGlzIHN5c3RlbWF0aWMgbGl0ZXJhdHVyZSByZXZpZXcsIGl0IGlzIHZlcnkgY2hhbGxlbmdpbmcgdG8gcmV0cmlldmUgd2hhdCBpcyBleGFjdGx5IG1lYXN1cmVkIGluIGVhY2ggYW5hbHlzaXMgc2luY2UgdGhlcmUgaXMgbm8gc3RhbmRhcmRpemVkIHdheSBvZiByZXBvcnRpbmcgdGhlIHJlc3VsdHMuIE9uZSBzdHVkeSBtYXkgZm9yIGluc3RhbmNlIGNsYWltIHRoYXQgYSAxMCAkXG11IGcvbV57M30kIGluY3JlYXNlIGluIFBNMi41IGNvbmNlbnRyYXRpb24gbGVhZHMgdG8gYW4gaW5jcmVhc2Ugb2YgeCUgaW4gaG9zcGl0YWwgYWRtaXNzaW9ucyBvdmVyIHRoZSBjb3Vyc2Ugb2YgYSB5ZWFyIHdoaWxlIGFub3RoZXIgc3R1ZHkgbWF5IHN0YXRlIHRoYXQgYSAyJSBpbmNyZWFzZSBpbiBvem9uZSBjb25jZW50cmF0aW9uIGluY3JlYXNlcyB0aGUgbnVtYmVyIG9mIGRlYXRocyBieSAzIG92ZXIgYSBtb250aC4gRm9ydHVuYXRlbHksIGZvciBlYWNoIGVzdGltYXRlIHJldHJpZXZlZCwgZXZlbiB0aG91Z2ggd2UgZG8gbm90IGtub3cgd2hhdCBpcyBtZWFzdXJlZCwgd2UgY2FuIGV2YWx1YXRlIHRoZSBwcmVjaXNpb24gd2l0aCB3aGljaCBpdCBpcyBlc3RpbWF0ZWQuCgpUbyBjaXJjdW12ZW50IHRoZSBmYWN0IHRoYXQgd2UgZG8gbm90IGtub3cgdGhlIGFjdHVhbCBlZmZlY3Qgc2l6ZSwgd2UgZm9sbG93IHRoZSBzdHJhdGVneSBzdWdnZXN0ZWQgYnkgR2VsbWFuIGFuZCBDYXJsaW4gKDIwMTQpLiBXZSBjb25zaWRlciBkaWZmZXJlbnQgcG90ZW50aWFsICJ0cnVlIiBlZmZlY3Qgc2l6ZXMgYW5kIHJ1biByb2J1c3RuZXNzIGNoZWNrcy4gVGhpcyBlbmFibGVzIHVzIHRvIGludmVzdGlnYXRlIHdoYXQgd291bGQgYmUgdGhlIHBvd2VyLCB0eXBlIE0gYW5kIHR5cGUgUyBlcnJvciBpZiB0aGUgdHJ1ZSBlZmZlY3Qgd2FzIG9ubHkgYSBmcmFjdGlvbiBvZiB0aGUgbWVhc3VyZWQgZWZmZWN0LiBJdCBlbmFibGVzIHVzIHRvIGFzc2VzcyB3aGV0aGVyIHRoZSBkZXNpZ24gb2YgdGhlIHN0dWR5IGlzIGdvb2QgZW5vdWdoIHRvIGRldGVjdCBhIHNtYWxsZXIgZWZmZWN0LiBJZiBhc3N1bWluZyB0aGF0IHRoZSB0cnVlIGVmZmVjdCBpcyAzLzQgb2YgdGhlIG1lYXN1cmVkIGVmZmVjdCB5aWVsZHMgYSBwb3dlciBvZiAzMCUsIHRoZXJlIGlzIGEgcHJvYmFibHkgYSBrZXkgaXNzdWUgd2l0aCB0aGUgZGVzaWduIG9mIHRoaXMgc3R1ZHkuIFRoaXMgZGVzaWduIHdvdWxkIG9ubHkgZW5hYmxlIHRvIGRldGVjdCB0aGlzIChub24gemVybykgZWZmZWN0IDMwJSBvZiB0aGUgdGltZS4KCk9mIGNvdXJzZSwgdGhlcmUgaXMgbm8gcmVhc29uIHRvIHRoaW5rICphIHByaW9yaSogdGhhdCBhIGdpdmVuIGVmZmVjdCB3b3VsZCBiZSBvdmVyZXN0aW1hdGVkLiBUaGUgcmVzdWx0cyBhcmUgb25seSBpbmZvcm1hdGl2ZS4gCgpUbyBjYXJyeSBvdXQgdGhpcyBhbmFseXNpcywgd2UgdXNlIHRoZSBwYWNrYWdlIGByZXRyb2Rlc2lnbmAgd2hpY2ggY29tcHV0ZXMgcG9zdCBhbmFseXNpcyBkZXNpZ24gY2FsY3VsYXRpb25zIChwb3dlciwgdHlwZSBNIGFuZCB0eXBlIFMgZXJyb3JzKS4gV2UgcnVuIHRoZSBmdW5jdGlvbiBgcmV0cm9fZGVzaW5nKClgIGZvciBzZXZlcmFsIGVmZmVjdCBzaXplcy4KCmBgYHtyfQpyZXRyb19hbmFseXNpcyA8LSBlc3RpbWF0ZXNfc3RhdHMgJT4lIAogIG11dGF0ZSgKICAgIHJldHJvX2xvdyA9IGFzX3RpYmJsZShyZXRyb19kZXNpZ24obG93X0NJLCBzZSkpLAogICAgcmV0cm9fMC4wMSA9IGFzX3RpYmJsZShyZXRyb19kZXNpZ24oZWZmZWN0KjAuMDEsIHNlKSksCiAgICByZXRyb18wLjA1ID0gYXNfdGliYmxlKHJldHJvX2Rlc2lnbihlZmZlY3QqMC4wNSwgc2UpKSwKICAgIHJldHJvXzAuMSA9IGFzX3RpYmJsZShyZXRyb19kZXNpZ24oZWZmZWN0KjAuMSwgc2UpKSwKICAgIHJldHJvXzAuMzMgPSBhc190aWJibGUocmV0cm9fZGVzaWduKGVmZmVjdCowLjMzLCBzZSkpLAogICAgcmV0cm9fMC41ID0gYXNfdGliYmxlKHJldHJvX2Rlc2lnbihlZmZlY3QqMC41LCBzZSkpLAogICAgcmV0cm9fMC42NyA9IGFzX3RpYmJsZShyZXRyb19kZXNpZ24oZWZmZWN0KjAuNjcsIHNlKSksCiAgICByZXRyb18wLjc1ID0gYXNfdGliYmxlKHJldHJvX2Rlc2lnbihlZmZlY3QqMC43NSwgc2UpKSwKICAgIHJldHJvXzAuOSA9IGFzX3RpYmJsZShyZXRyb19kZXNpZ24oZWZmZWN0KjAuOSwgc2UpKSwKICAgIHJldHJvXzEgPSBhc190aWJibGUocmV0cm9fZGVzaWduKGVmZmVjdCoxLCBzZSkpCiAgKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKAogICAgc3RhcnRzX3dpdGgoInJldHJvIiksIAogICAgbmFtZXNfdG8gPSAicHJvcF90cnVlX2VmZmVjdCIsIAogICAgdmFsdWVzX3RvID0gImNvbXB1dGVkIgogICkgJT4lIAogIG11dGF0ZSgKICAgIHBvd2VyID0gY29tcHV0ZWQkcG93ZXIsCiAgICB0eXBlUyA9IGNvbXB1dGVkJHR5cGVTLAogICAgdHlwZU0gPSBjb21wdXRlZCR0eXBlTSwKICAgIHByb3BfdHJ1ZV9lZmZlY3QgPSBhcy5udW1lcmljKHN0cl9zdWIocHJvcF90cnVlX2VmZmVjdCwgNywgbmNoYXIocHJvcF90cnVlX2VmZmVjdCkpKSwKICAgIHByb3BfdHJ1ZV9lZmZlY3RfcGhyYXNlID0gc3RyX2MocHJvcF90cnVlX2VmZmVjdCoxMDAsICIlIG9mIHRoZSBtZWFzdXJlZCBlZmZlY3QiKQogICkgJT4lIAogIHNlbGVjdCgtY29tcHV0ZWQpICU+JSAKICBmaWx0ZXIodHlwZU0gPCBJbmYpIApgYGAKCiMjIyBPdmVyYWwgYW5hbHlzaXMKCkluIGEgZmlyc3QgcGFydCwgd2UgY2Fycnkgb3V0IG91ciBhbmFseXNpcyBvbiB0aGUgd2hvbGUgc2V0IG9mIGFic3RyYWN0cy4gV2Ugbm90aWNlIHRoYXQgdGhlcmUgaXMgc29tZSBoZXRlcm9nZW5laXR5IGFjcm9zcyBhcnRpY2xlcywgc29tZSBhcnRpY2xlcyBkaXNwbGF5aW5nIGEgaGlnaCBwb3dlciBhbmQgb3RoZXJzIGRpc3BsYXlpbmcgbG93ZXIgcG93ZXIuIFRodXMsIGluIGEgc2Vjb25kIHBhcnQsIHdlIHdpbGwgbG9vayBpbiBtb3JlIGRldGFpbHMgYXQgYXJ0aWNsZXMgZGlzcGxheWluZyBsb3cgcG93ZXIuCgpXZSBzdGFydCBieSBjb21wdXRpbmcgdGhlIGF2ZXJhZ2UgYW5kIG1lZGlhbiBwb3dlciwgdHlwZSBNIGFuZCB0eXBlIFMgZXJyb3JzIGZvciBhIHNldCBvZiAidHJ1ZSIgZWZmZWN0cy4gCgpgYGB7cn0KcmV0cm9fYW5hbHlzaXMgJT4lIAogICMgZmlsdGVyKHR5cGVNIDwgSW5mKSAlPiUKICBncm91cF9ieShwcm9wX3RydWVfZWZmZWN0LCBwcm9wX3RydWVfZWZmZWN0X3BocmFzZSkgJT4lIAogIHN1bW1hcmlzZSgKICAgIG1lYW5fcG93ZXIgPSBtZWFuKHBvd2VyLCBuYS5ybSA9IFRSVUUpLAogICAgbWVkaWFuX3Bvd2VyID0gbWVkaWFuKHBvd2VyLCBuYS5ybSA9IFRSVUUpLAogICAgbWVhbl90eXBlTSA9IG1lYW4odHlwZU0sIG5hLnJtID0gVFJVRSksCiAgICBtZWRpYW5fdHlwZU0gPSBtZWRpYW4odHlwZU0sIG5hLnJtID0gVFJVRSksCiAgICBtZWFuX3R5cGVTID0gbWVhbih0eXBlUywgbmEucm0gPSBUUlVFKSwKICAgIG1lZGlhbl90eXBlUyA9IG1lZGlhbih0eXBlUywgbmEucm0gPSBUUlVFKSwgCiAgICAuZ3JvdXBzID0gImRyb3AiCiAgKSAlPiUgCiAgYXJyYW5nZShwcm9wX3RydWVfZWZmZWN0KSAlPiUgCiAgc2VsZWN0KC1wcm9wX3RydWVfZWZmZWN0KSAlPiUKICBtdXRhdGUoCiAgICBwcm9wX3RydWVfZWZmZWN0X3BocmFzZSA9IGlmZWxzZSgKICAgICAgaXMubmEocHJvcF90cnVlX2VmZmVjdF9waHJhc2UpLCAKICAgICAgIkxvd2VyIGJvdW5kIG9mIHRoZSBDSSIsIAogICAgICBwcm9wX3RydWVfZWZmZWN0X3BocmFzZSkKICApICU+JSAKICBrYWJsZShjb2wubmFtZXMgPSBjKCIiLCAiTWVhbiIsICJNZWRpYW4iLCAiTWVhbiIsICJNZWRpYW4iLCAiTWVhbiIsICJNZWRpYW4iKSkgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCciVHJ1ZSIgZWZmZWN0JyA9IDEsICJQb3dlciIgPSAyLCAiVHlwZSBNIiA9IDIsICJUeXBlIFMiID0gMikpCmBgYAoKVGhlbiwgd2UgZXhwbG9yZSBncmFwaGljYWxseSB0aGUgZGlzdHJpYnV0aW9uIG9mIHBvd2VyLCB0eXBlIE0gYW5kIHR5cGUgUyBlcnJvciBhY3Jvc3Mgc2ltdWxhdGlvbiBhbmQgZm9yIGRpZmZlcmVudCBtYWduaXR1ZGVzIG9mIHRoZSB0cnVlIGVmZmVjdC4KCmBgYHtyfQpzaXplc190b19kaXNwbGF5IDwtIGMoMC4zMywgMC41LCAwLjc1KQoKcmV0cm9fYW5hbHlzaXMgJT4lCiAgZmlsdGVyKHByb3BfdHJ1ZV9lZmZlY3QgJWluJSBzaXplc190b19kaXNwbGF5KSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwb3dlcikpICsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTApICsKICBmYWNldF93cmFwKCB+IHByb3BfdHJ1ZV9lZmZlY3RfcGhyYXNlKSArCiAgbGFicygKICAgIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBwb3dlciBpbiB0aGUgbGl0ZXJhdHVyZSIsIAogICAgc3VidGl0bGUgPSAiSWYgdGhlIG1hZ25pdHVkZSBvZiB0cnVlIGVmZmVjdCBpcyBhIGZyYWN0aW9uIG9mIHRoZSBtZWFzdXJlZCBlZmZlY3QiCiAgKQojIGdlb21fZGVuc2l0eSgpCgpyZXRyb19hbmFseXNpcyAlPiUKICBmaWx0ZXIocHJvcF90cnVlX2VmZmVjdCAlaW4lIHNpemVzX3RvX2Rpc3BsYXkpICU+JQogIGdncGxvdChhZXMoeCA9IHR5cGVNKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMCkgKwogIGZhY2V0X3dyYXAoIH4gcHJvcF90cnVlX2VmZmVjdF9waHJhc2UpICsKICBsYWJzKAogICAgdGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIHR5cGUgTSBlcnJvciBpbiB0aGUgbGl0ZXJhdHVyZSAobG9nIHNjYWxlKSIsIAogICAgc3VidGl0bGUgPSAiSWYgdGhlIG1hZ25pdHVkZSBvZiB0cnVlIGVmZmVjdCBpcyBhIGZyYWN0aW9uIG9mIHRoZSBtZWFzdXJlZCBlZmZlY3QiCiAgKSArCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gJ2xvZzEwJykKCnJldHJvX2FuYWx5c2lzICU+JQogIGZpbHRlcihwcm9wX3RydWVfZWZmZWN0ICVpbiUgc2l6ZXNfdG9fZGlzcGxheSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdHlwZVMpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwKSArCiAgZmFjZXRfd3JhcCggfiBwcm9wX3RydWVfZWZmZWN0X3BocmFzZSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgdHlwZSBTIGVycm9yIGluIHRoZSBsaXRlcmF0dXJlIiwgCiAgICBzdWJ0aXRsZSA9ICJJZiB0aGUgbWFnbml0dWRlIG9mIHRydWUgZWZmZWN0IGlzIGEgZnJhY3Rpb24gb2YgdGhlIG1lYXN1cmVkIGVmZmVjdCIKICApCmBgYAoKQSBsYXJnZSBjaHVuayBvZiBhcnRpY2xlcyBkaXNwbGF5IGhpZ2ggcG93ZXIgYW5kIGxvdyByYXRlcyBvZiB0eXBlIE0gYW5kIHR5cGUgUyBlcnJvciwgaW4gZWFjaCByb2J1c3RuZXNzIGNoZWNrLiBIb3dldmVyLCBhIG5vbiBuZWdsaWdpYmxlIG51bWJlciBvZiBhcnRpY2xlcyBkaXNwbGF5IGxvd2VyIHBvd2VyIGFuZC9vciBzb21lIGV2aWRlbmNlIG9mIHR5cGUgTSBlcnJvci4gVHlwZSBTIGVycm9yIGRvZXMgbm90IHNlZW0gdG8gYmUgYW4gaW1wb3J0YW50IGlzc3VlIGluIHRoaXMgbGl0ZXJhdHVyZS4gV2UgaW52ZXN0aWdhdGUgcG90ZW50aWFsIGRyaXZlciBvZiBsb3cgcG93ZXIgYW5kIHR5cGUgTSBlcnJvcnMgZnVydGhlciBpbiB0aGUgbmV4dCBzdWJzZWN0aW9uLgoKTm90ZSB0aGF0IGZvciB0eXBlIE0gZXJyb3JzLCBkdWUgdG8gc29tZSBvdXRsaWVycywgd2UgdXNlZCBhIGxvZyBzY2FsZS4gV2l0aG91dCB0aGlzIGxvZyBzY2FsZSBhbmQgcmVzdHJpY3Rpbmcgb3VyIHNhbXBsZSB0byB0eXBlIE0gZXJyb3JzIGxvd2VyIHRoYW4gMi41ICg5NSUgb2Ygb3VyIHNhbXBsZSwgZXZlbiB3aGVuIHdlIGFzc3VtZSB0aGF0IHRoZSB0cnVlIGVmZmVjdCBpcyBvbmx5IDEvMyBvZiB0aGUgZXN0aW1hdGVkIG9uZSkuCgpgYGB7cn0KcmV0cm9fYW5hbHlzaXMgJT4lCiAgZmlsdGVyKHByb3BfdHJ1ZV9lZmZlY3QgJWluJSBzaXplc190b19kaXNwbGF5KSAlPiUKICBmaWx0ZXIodHlwZU0gPCAyLjUpICU+JQogIGdncGxvdChhZXMoeCA9IHR5cGVNKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMCkgKwogIGZhY2V0X3dyYXAoIH4gcHJvcF90cnVlX2VmZmVjdF9waHJhc2UpICsKICBsYWJzKAogICAgdGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIHR5cGUgTSBlcnJvciBpbiB0aGUgbGl0ZXJhdHVyZSIsIAogICAgc3VidGl0bGUgPSAiSWYgdGhlIG1hZ25pdHVkZSBvZiB0cnVlIGVmZmVjdCBpcyBhIGZyYWN0aW9uIG9mIHRoZSBtZWFzdXJlZCBlZmZlY3QiCiAgKSAKYGBgCgpXZSBmaW5kIHRoYXQsIGV2ZW4gaWYgdGhlIG1lYXN1cmVkIGVmZmVjdCBpcyB0aGUgdHJ1ZSBlZmZlY3QsIHRoZXJlIGlzIHNvbWUgcmlzayBvZiB0eXBlIE0gZXJyb3IuIAoKQWx0ZXJuYXRpdmVseSwgd2UgY2FuIGFsc28gbG9vayBhdCB3aGF0IHdvdWxkIGJlIHRoZSBwb3dlciwgdHlwZSBNIGFuZCB0eXBlIFMgaWYgdGhlIHRydWUgZWZmZWN0IHdhcyBlcXVhbCB0byB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwuIAoKYGBge3J9CnJldHJvX2FuYWx5c2lzICU+JSAKICBmaWx0ZXIodHlwZU0gPCA1KSAlPiUgCiAgZmlsdGVyKGlzLm5hKHByb3BfdHJ1ZV9lZmZlY3QpKSAlPiUgCiAgbXV0YXRlKHByb3BfdHJ1ZV9lZmZlY3QgPSAibG93X0NJIikgJT4lIAogIHBpdm90X2xvbmdlcihwb3dlcjp0eXBlTSwgbmFtZXNfdG8gPSAiZGVzaWduX3N0YXQiKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gdmFsdWUpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwKSArCiAgZmFjZXRfd3JhcCggfiBkZXNpZ25fc3RhdCwgc2NhbGVzID0gImZyZWUiKSArCiAgbGFicygKICAgIHggPSAiIiwgCiAgICB5ID0gIk51bWJlciBvZiBlc3RpbWF0ZXMiLAogICAgdGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIGRlc2lnbiBzdGF0aXN0aWNzIGluIHRoZSBsaXRlcmF0dXJlIiwgCiAgICBzdWJ0aXRsZSA9ICJJZiB0aGUgbWFnbml0dWRlIG9mIHRydWUgZWZmZWN0IGlzIGVxdWFsIHRvIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgQ0kiCiAgKSAKYGBgCgoKVGhlIEVDREYgYWxzbyBwcm92aWRlIHVzZWZ1bCBpbmZvcm1hdGlvbiBvbiB0aGUgZGlzdHJpYnV0aW9uIG9mIHBvd2VyLCB0eXBlIE0gYW5kIHR5cGUgUyBlcnJvcnMgYWNyb3NzIHN0dWRpZXMuCgpgYGB7cn0KcmV0cm9fYW5hbHlzaXMgJT4lCiAgZmlsdGVyKHByb3BfdHJ1ZV9lZmZlY3QgJWluJSBzaXplc190b19kaXNwbGF5KSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwb3dlcikpICsKICBzdGF0X2VjZGYoZ2VvbSA9ICJsaW5lIikgKwogIGZhY2V0X3dyYXAoIH4gcHJvcF90cnVlX2VmZmVjdF9waHJhc2UpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLjgsIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAwLjMpICsKICBsYWJzKAogICAgdGl0bGUgPSAiRW1waXJpY2FsIGN1bXVsYXRpdmUgZGlzdHJpYnV0aW9uIG9mIHBvd2VyIGluIHRoZSBsaXRlcmF0dXJlIiwKICAgIHN1YnRpdGxlID0gIklmIHRoZSBtYWduaXR1ZGUgb2YgdHJ1ZSBlZmZlY3QgaXMgYSBmcmFjdGlvbiBvZiB0aGUgbWVhc3VyZWQgZWZmZWN0IiwKICAgIHggPSAiUG93ZXIiLAogICAgeSA9ICJQcm9wb3J0aW9uIG9mIGVzdGltYXRlcyIsIAogICAgY2FwdGlvbiA9ICJUaGUgZGFzaGVkIGxpbmUgcmVwcmVzZW50cyB0aGUgdXN1YWwgODAlIHBvd2VyIHRocmVzaG9sZCIKICApCgpyZXRyb19hbmFseXNpcyAlPiUKICBmaWx0ZXIocHJvcF90cnVlX2VmZmVjdCAlaW4lIHNpemVzX3RvX2Rpc3BsYXkpICU+JQogIGZpbHRlcih0eXBlTSA8IDIuNSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdHlwZU0pKSArCiAgc3RhdF9lY2RmKGdlb20gPSAibGluZSIpICsKICAjIGNvb3JkX2ZsaXAoKSArCiAgZmFjZXRfd3JhcCggfiBwcm9wX3RydWVfZWZmZWN0X3BocmFzZSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJFbXBpcmljYWwgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gb2YgcG93ZXIgaW4gdGhlIGxpdGVyYXR1cmUiLAogICAgc3VidGl0bGUgPSAiSWYgdGhlIG1hZ25pdHVkZSBvZiB0cnVlIGVmZmVjdCBpcyBhIGZyYWN0aW9uIG9mIHRoZSBtZWFzdXJlZCBlZmZlY3QiLAogICAgeCA9ICJUeXBlIE0gZXJyb3IiLAogICAgeSA9ICJQcm9wb3J0aW9uIG9mIGVzdGltYXRlcyIKICApCgpyZXRyb19hbmFseXNpcyAlPiUKICBmaWx0ZXIocHJvcF90cnVlX2VmZmVjdCAlaW4lIHNpemVzX3RvX2Rpc3BsYXkpICU+JQogIGdncGxvdChhZXMoeCA9IHR5cGVTKSkgKwogIHN0YXRfZWNkZihnZW9tID0gImxpbmUiKSArCiAgIyBjb29yZF9mbGlwKCkgKwogIGZhY2V0X3dyYXAoIH4gcHJvcF90cnVlX2VmZmVjdF9waHJhc2UpICsKICBsYWJzKAogICAgdGl0bGUgPSAiRW1waXJpY2FsIGN1bXVsYXRpdmUgZGlzdHJpYnV0aW9uIG9mIHBvd2VyIGluIHRoZSBsaXRlcmF0dXJlIiwKICAgIHN1YnRpdGxlID0gIklmIHRoZSBtYWduaXR1ZGUgb2YgdHJ1ZSBlZmZlY3QgaXMgYSBmcmFjdGlvbiBvZiB0aGUgbWVhc3VyZWQgZWZmZWN0IiwKICAgIHggPSAiVHlwZSBTIGVycm9yIiwKICAgIHkgPSAiUHJvcG9ydGlvbiBvZiBlc3RpbWF0ZXMiCiAgKSAKYGBgCgpXZSBub3RpY2UgdGhhdCBhYm91dCA1MCUgb2Ygc3R1ZGllcyB3b3VsZCBiZSB1bmRlcnBvd2VyZWQgYXQgdGhlIGNvbnZlbnRpb25hbCA4MCUgbGV2ZWwgaWYgd2UgY29uc2lkZXJlZCB0aGF0IHRoZSB0cnVlIGVmZmVjdCB3YXMgaGFsZiB0aGUgbWVhc3VyZWQgZWZmZWN0LgoKRm9yIEVDREZzIHRvbyB3ZSBjYW4gbG9vayBhdCB3aGF0IHdvdWxkIGJlIHRoZSBwb3dlciwgdHlwZSBNIGFuZCB0eXBlIFMgZXJyb3IgaWYgdGhlIHRydWUgZWZmZWN0IHdhcyBlcXVhbCB0byB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwuCgpgYGB7cn0KcmV0cm9fYW5hbHlzaXMgJT4lIAogIGZpbHRlcih0eXBlTSA8IDUpICU+JQogIGZpbHRlcihpcy5uYShwcm9wX3RydWVfZWZmZWN0KSkgJT4lIAogIG11dGF0ZShwcm9wX3RydWVfZWZmZWN0ID0gImxvd19DSSIpICU+JSAKICBwaXZvdF9sb25nZXIocG93ZXI6dHlwZU0sIG5hbWVzX3RvID0gImRlc2lnbl9zdGF0IikgJT4lIAogIGdncGxvdChhZXMoeCA9IHZhbHVlKSkgKwogIHN0YXRfZWNkZihnZW9tID0gImxpbmUiKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUpICsKICBjb29yZF9mbGlwKCkgKwogIGZhY2V0X3dyYXAoIH4gZGVzaWduX3N0YXQsIHNjYWxlcyA9ICJmcmVlIikgKwogIGxhYnMoCiAgICB4ID0gIiIsIAogICAgeSA9ICJQcm9wb3J0aW9uIG9mIGVzdGltYXRlcyIsCiAgICB0aXRsZSA9ICJFbXBpcmljYWwgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gb2YgZGVzaWduIHN0YXRpc3RpY3MgaW4gdGhlIGxpdGVyYXR1cmUiLCAKICAgIHN1YnRpdGxlID0gIklmIHRoZSBtYWduaXR1ZGUgb2YgdHJ1ZSBlZmZlY3QgaXMgZXF1YWwgdG8gdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBDSSIKICApIApgYGAKCgpUaGVuLCB3ZSBsb29rIGhvdyB0eXBlIE0gYW5kIHR5cGUgUyBlcnJvciBldm9sdmUgd2l0aCBwb3dlciBmb3IgdGhlIGVzdGltYXRlcyBjb25zaWRlcmVkLgoKYGBge3J9CnJldHJvX2FuYWx5c2lzICU+JQogIGZpbHRlcihwcm9wX3RydWVfZWZmZWN0ICVpbiUgc2l6ZXNfdG9fZGlzcGxheSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcG93ZXIsIHkgPSB0eXBlTSkpICsKICBnZW9tX3BvaW50KCkgKwogIGZhY2V0X3dyYXAoIH4gcHJvcF90cnVlX2VmZmVjdF9waHJhc2UpICsKICBsYWJzKAogICAgdGl0bGUgPSAiTGluayBiZXR3ZWVuIHR5cGUgTSBlcnJvciBhbmQgcG93ZXIgaW4gdGhlIGxpdGVyYXR1cmUiLAogICAgc3VidGl0bGUgPSAiSWYgdGhlIG1hZ25pdHVkZSBvZiB0cnVlIGVmZmVjdCBpcyBhIGZyYWN0aW9uIG9mIHRoZSBtZWFzdXJlZCBlZmZlY3QiLAogICAgeCA9ICJQb3dlciIsCiAgICB5ID0gIlR5cGUgTSIKICApCgpyZXRyb19hbmFseXNpcyAlPiUKICBmaWx0ZXIocHJvcF90cnVlX2VmZmVjdCAlaW4lIHNpemVzX3RvX2Rpc3BsYXkpICU+JQogIGdncGxvdChhZXMoeCA9IHBvd2VyLCB5ID0gdHlwZVMpKSArCiAgZ2VvbV9wb2ludCgpICsKICBmYWNldF93cmFwKCB+IHByb3BfdHJ1ZV9lZmZlY3RfcGhyYXNlKSArCiAgbGFicygKICAgIHRpdGxlID0gIkxpbmsgYmV0d2VlbiB0eXBlIFMgZXJyb3IgYW5kIHBvd2VyIGluIHRoZSBsaXRlcmF0dXJlIiwKICAgIHN1YnRpdGxlID0gIklmIHRoZSBtYWduaXR1ZGUgb2YgdHJ1ZSBlZmZlY3QgaXMgYSBmcmFjdGlvbiBvZiB0aGUgbWVhc3VyZWQgZWZmZWN0IiwKICAgIHggPSAiUG93ZXIiLAogICAgeSA9ICJUeXBlIFMiCiAgKQpgYGAKVGhlcmUgaXMgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBvd2VyIGFuZCB0eXBlIE0gYW5kIHR5cGUgUyBlcnJvci4gTm90IHN1cnByaXNpbmdseSwgdHlwZSBNIGFuZCB0eXBlIFMgZXJyb3Igc2t5cm9ja2V0IGluIHN0dWRpZXMgd2l0aCBsb3cgcG93ZXIuIAoKV2UgdGhlbiBpbnZlc3RpZ2F0ZSBob3cgYXZlcmFnZSBwb3dlciwgdHlwZSBNIGFuZCB0eXBlIFMgZXZvbHZlIGFzIGEgcHJvcG9ydGlvbiBvZiB0aGUgdHJ1ZSBlZmZlY3Qgc2l6ZS4KCmBgYHtyfQpyZXRyb19hbmFseXNpcyAlPiUgCiAgZ3JvdXBfYnkocHJvcF90cnVlX2VmZmVjdCkgJT4lIAogIHN1bW1hcmlzZShQb3dlciA9IG1lYW4ocG93ZXIsIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAiZHJvcF9sYXN0IikgJT4lIAogIGdncGxvdChhZXMoeCA9IHByb3BfdHJ1ZV9lZmZlY3QsIHkgPSBQb3dlcikpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBhbHBoYSA9IDAuNykgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuOCwgc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgYWxwaGEgPSAwLjcpICsKICBsYWJzKAogICAgdGl0bGUgPSAiRXZvbHV0aW9uIG9mIGF2ZXJhZ2UgcG93ZXIgYXMgYSBmdW5jdGlvbiBvZiB0aGUgJ3RydWUgZWZmZWN0JyIsIAogICAgeCA9ICJUcnVlIGVmZmVjdCBhcyBhIHByb3BvcnRpb24gb2YgdGhlIG1lYXN1cmVkIGVmZmVjdCIsIAogICAgY2FwdGlvbiA9ICJUaGUgZGFzaGVkIGxpbmUgcmVwcmVzZW50cyB0aGUgdXN1YWwgODAlIHBvd2VyIHRocmVzaG9sZCIKICApICsKICB5bGltKDAsMSkKCnJldHJvX2FuYWx5c2lzICU+JSAKICBncm91cF9ieShwcm9wX3RydWVfZWZmZWN0KSAlPiUgCiAgc3VtbWFyaXNlKHR5cGVNID0gbWVhbih0eXBlTSwgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICJkcm9wX2xhc3QiKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcHJvcF90cnVlX2VmZmVjdCwgeSA9IHR5cGVNKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGFscGhhID0gMC43KSArCiAgbGFicygKICAgIHRpdGxlID0gIkV2b2x1dGlvbiBvZiBhdmVyYWdlIHR5cGUgTSBlcnJvciBhcyBhIGZ1bmN0aW9uIG9mIHRoZSAndHJ1ZSBlZmZlY3QnIiwgCiAgICB4ID0gIlRydWUgZWZmZWN0IGFzIGEgcHJvcG9ydGlvbiBvZiB0aGUgbWVhc3VyZWQgZWZmZWN0IiwgCiAgICB5ID0gIlR5cGUgTSIKICApCgpyZXRyb19hbmFseXNpcyAlPiUgCiAgZ3JvdXBfYnkocHJvcF90cnVlX2VmZmVjdCkgJT4lIAogIHN1bW1hcmlzZSh0eXBlUyA9IG1lYW4odHlwZVMsIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAiZHJvcF9sYXN0IikgJT4lIAogIGdncGxvdChhZXMoeCA9IHByb3BfdHJ1ZV9lZmZlY3QsIHkgPSB0eXBlUykpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBhbHBoYSA9IDAuNykgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJFdm9sdXRpb24gb2YgYXZlcmFnZSB0eXBlIFMgZXJyb3IgYXMgYSBmdW5jdGlvbiBvZiB0aGUgJ3RydWUgZWZmZWN0JyIsIAogICAgeCA9ICJUcnVlIGVmZmVjdCBhcyBhIHByb3BvcnRpb24gb2YgdGhlIG1lYXN1cmVkIGVmZmVjdCIsIAogICAgeSA9ICJUeXBlIFMiCiAgKQpgYGAKClBvd2VyLCBkZWNyZWFzZXMgYW5kIHR5cGUgTSBhbmQgdHlwZSBTIGVycm9ycyBza3lyb2NrZXQgZm9yIHNtYWxsIHZhbHVlcyBvZiB0aGUgdHJ1ZSBlZmZlY3QgKGFzIGEgcHJvcG9ydGlvbiBvZiB0aGUgbWVhc3VyZWQgZWZmZWN0KS4gSW4gYWRkaXRpb24gb24gYXZlcmFnZSwgaWYgZm9yIGVhY2ggcGFwZXIgb2YgdGhlIGxpdGVyYXR1cmUsIHRoZSB0cnVlIGVmZmVjdHMgYXJlIDMvNCBvZiB0aGUgbWVhc3VyZWQgZWZmZWN0LCB0aGUgcG93ZXIgd291bGQgYmUgbG93ZXIgdGhhbiB0aGUgdXN1YWwgODAlLiBUeXBlIFMgZXJyb3Igb25seSBzZWVtIHRvIGJlIGFuIGlzc3VlIGZvciBzbWFsbCB2YWx1ZXMgb2YgdGhlIHRydWUgZWZmZWN0IGFzIGEgcG9ydGlvbiBvZiB0aGUgbWVhc3VyZWQgZWZmZWN0LiBUeXBlIE0gZXJyb3Igc2VlbXMgdG8gYmUgbW9yZSBjb25zaXN0ZW50bHkgcHJvYmxlbWF0aWMuIFRoZSBzaG9vdCB1cCBpbiB0aGUgcHJldmlvdXMgZ3JhcGggbWFrZXMgaXQgZGlmZmljdWx0IHRvIHJlYWQgdGhlIHZhbHVlcyBvZiB0eXBlIE0gZXJyb3Igd2hlbiB0aGUgdHJ1ZSBlZmZlY3QgaXMgbm90IGEgc21hbGwgcG9ydGlvbiBvZiB0aGUgbWVhc3VyZWQgZWZmZWN0LiBXZSB0aGVyZWZvcmUgem9vbSBpbi4KCmBgYHtyfQpyZXRyb19hbmFseXNpcyAlPiUKICBmaWx0ZXIocHJvcF90cnVlX2VmZmVjdCA+IDAuMjUpICU+JQogIGdyb3VwX2J5KHByb3BfdHJ1ZV9lZmZlY3QpICU+JQogIHN1bW1hcmlzZSh0eXBlTSA9IG1lYW4odHlwZU0sIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAiZHJvcF9sYXN0IikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHJvcF90cnVlX2VmZmVjdCwgeSA9IHR5cGVNKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGFscGhhID0gMC43KSArCiAgbGFicygKICAgIHRpdGxlID0gIkV2b2x1dGlvbiBvZiBhdmVyYWdlIHR5cGUgTSBlcnJvciBhcyBhIGZ1bmN0aW9uIG9mIHRoZSAndHJ1ZSBlZmZlY3QnIiwgCiAgICB4ID0gIlRydWUgZWZmZWN0IGFzIGEgcHJvcG9ydGlvbiBvZiB0aGUgbWVhc3VyZWQgZWZmZWN0IiwgCiAgICB5ID0gIlR5cGUgTSIpICsKICB5bGltKDEsIDIuMikKYGBgCgpXZSBub3RpY2UgdGhhdCwgb24gYXZlcmFnZSBpbiB0aGUgbGl0ZXJhdHVyZSwgdGhlIHRyZWF0bWVudCBlZmZlY3RzIGFyZSBvdmVyZXN0aW1hdGVkLCBldmVuIGZvciBsYXJnZSB2YWx1ZXMgb2YgdGhlIHRydWUgZWZmZWN0LiBUaGlzIHJlc3VsdCBtaWdodCBiZSBsaW5rZWQgdG8gc29tZSBvdXRsaWVycy4gV2UgdGh1cyBsb29rIGF0IHRoZSBldm9sdXRpb24gb2YgdGhlIG1lZGlhbiBlZmZlY3Qgd2l0aCB0cnVlIGVmZmVjdCBzaXplLgoKYGBge3J9CnJldHJvX2FuYWx5c2lzICU+JSAKICBncm91cF9ieShwcm9wX3RydWVfZWZmZWN0KSAlPiUgCiAgc3VtbWFyaXNlKFBvd2VyID0gbWVkaWFuKHBvd2VyLCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gImRyb3BfbGFzdCIpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBwcm9wX3RydWVfZWZmZWN0LCB5ID0gUG93ZXIpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgYWxwaGEgPSAwLjcpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjgsIHNpemUgPSAwLjUsIGxpbmV0eXBlID0gImRhc2hlZCIsIGFscGhhID0gMC43KSArCiAgbGFicygKICAgIHRpdGxlID0gIkV2b2x1dGlvbiBvZiBtZWRpYW4gcG93ZXIgYXMgYSBmdW5jdGlvbiBvZiB0aGUgJ3RydWUgZWZmZWN0JyIsIAogICAgeCA9ICJUcnVlIGVmZmVjdCBhcyBhIHByb3BvcnRpb24gb2YgdGhlIG1lYXN1cmVkIGVmZmVjdCIKICApICsKICB5bGltKDAsMSkKCnJldHJvX2FuYWx5c2lzICU+JSAKICBmaWx0ZXIocHJvcF90cnVlX2VmZmVjdCA+IDAuMjUpICU+JQogIGdyb3VwX2J5KHByb3BfdHJ1ZV9lZmZlY3QpICU+JSAKICBzdW1tYXJpc2UodHlwZU0gPSBtZWRpYW4odHlwZU0sIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAiZHJvcF9sYXN0IikgJT4lIAogIGdncGxvdChhZXMoeCA9IHByb3BfdHJ1ZV9lZmZlY3QsIHkgPSB0eXBlTSkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBhbHBoYSA9IDAuNykgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJFdm9sdXRpb24gb2YgdGhlIG1lZGlhbiB0eXBlIE0gZXJyb3IgYXMgYSBmdW5jdGlvbiBvZiB0aGUgJ3RydWUgZWZmZWN0JyIsIAogICAgeCA9ICJUcnVlIGVmZmVjdCBhcyBhIHByb3BvcnRpb24gb2YgdGhlIG1lYXN1cmVkIGVmZmVjdCIsIAogICAgeSA9ICJUeXBlIE0iCiAgKSArCiAgeWxpbSgxLCAyLjIpCmBgYAoKV2Ugbm90aWNlIHRoYXQgdGhlIGlzc3VlIGlzIG11Y2ggbGVzcyBpbXBvcnRhbnQgd2hlbiBsb29raW5nIGF0IHRoZSBtZWRpYW4uIFRoaXMgc3VnZ2VzdHMgc29tZSBoZXRlcm9nZW5laXR5IGluIHRlcm1zIG9mIHBvd2VyIGluIHRoZSBsaXRlcmF0dXJlLgoKVG8gY29uZmlybSB0aGF0LCB3ZSBsb29rIGludG8gdGhlIGV2b2x1dGlvbiBvZiB0aGUgZGlzdHJpYnV0aW9uIHdpdGggdGhlIHByb3BvcnRpb24gb2YgZWZmZWN0IHNpemUuCgpgYGB7ciBmaWcuYXNwPTF9CnJldHJvX2FuYWx5c2lzICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBwb3dlciwgeSA9IGZhY3Rvcihwcm9wX3RydWVfZWZmZWN0KSkpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGNvbG9yID0gIiMwMDMxM0MiLCBmaWxsID0gIiMwMDMxM0MiLCBhbHBoYSA9IDAuMykgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJFdm9sdXRpb24gb2YgZGlzdHJ1YnRpb24gb2YgcG93ZXIgYXMgYSBmdW5jdGlvbiBvZiB0aGUgJ3RydWUgZWZmZWN0JyIsIAogICAgeCA9ICJQb3dlciIsIAogICAgeSA9ICJUcnVlIGVmZmVjdCBhcyBhIHByb3BvcnRpb24gb2YgdGhlIG1lYXN1cmVkIGVmZmVjdCIKICApIAoKcmV0cm9fYW5hbHlzaXMgJT4lIAogIGZpbHRlcih0eXBlTSA8IDUpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB0eXBlTSwgeSA9IGZhY3Rvcihwcm9wX3RydWVfZWZmZWN0KSkpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGNvbG9yID0gIiMwMDMxM0MiLCBmaWxsID0gIiMwMDMxM0MiLCBhbHBoYSA9IDAuMykgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJFdm9sdXRpb24gb2YgZGlzdHJ1YnRpb24gb2YgdHlwZSBNIGVycm9yIGFzIGEgZnVuY3Rpb24gb2YgdGhlICd0cnVlIGVmZmVjdCciLCAKICAgIHggPSAiVHlwZSBNIGVycm9yIiwgCiAgICB5ID0gIlRydWUgZWZmZWN0IGFzIGEgcHJvcG9ydGlvbiBvZiB0aGUgbWVhc3VyZWQgZWZmZWN0IgogICkKCiMgcmV0cm9fYW5hbHlzaXMgJT4lIAojICAgZ2dwbG90KGFlcyh4ID0gdHlwZVMsIHkgPSBmYWN0b3IocHJvcF90cnVlX2VmZmVjdCkpKSArCiMgICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGNvbG9yID0gIiMwMDMxM0MiLCBmaWxsID0gIiMwMDMxM0MiLCBhbHBoYSA9IDAuMykgKwojICAgbGFicygKIyAgICAgdGl0bGUgPSAiRXZvbHV0aW9uIG9mIGRpc3RydWJ0aW9uIG9mIHR5cGUgTSBlcnJvciBhcyBhIGZ1bmN0aW9uIG9mIHRoZSAndHJ1ZSBlZmZlY3QnIiwgCiMgICAgIHggPSAiVHlwZSBTIGVycm9yIiwgCiMgICAgIHkgPSAiVHJ1ZSBlZmZlY3QgYXMgYSBwcm9wb3J0aW9uIG9mIHRoZSBtZWFzdXJlZCBlZmZlY3QiCiMgICApCmBgYAoKVGhlIG92ZXJhbCBkaXN0cmlidXRpb24gb2YgcG93ZXIgc2VlbXMgYWxtb3N0IGJpbW9kYWw6IGVpdGhlciB0aGUgcG93ZXIgb2YgbW9zdCBpcyB2ZXJ5IGhpZ2ggb3IgaXQgaXMgdmVyeSBsb3cuCgpJdCBtaWdodCBhbHNvIGJlIGludGVyZXN0aW5nIHRvIGxvb2sgYXQgaG93IHBvd2VyLCB0eXBlIE0gYW5kIHR5cGUgUyBlcnJvciBldm9sdmVkIGluIHRpbWUsICppZSogd2l0aCBwdWJsaWNhdGlvbiBkYXRlLgoKYGBge3J9CnJldHJvX2FuYWx5c2lzX3B1YmRhdGUgPC0gcmV0cm9fYW5hbHlzaXMgJT4lIAogIGxlZnRfam9pbihhYnN0cmFjdHNfYW5kX21ldGFkYXRhICU+JSBzZWxlY3QoZG9pLCBwdWJfZGF0ZSksICwgYnkgPSAiZG9pIikKCnJldHJvX2FuYWx5c2lzX3B1YmRhdGUgJT4lIAogIGZpbHRlcihwcm9wX3RydWVfZWZmZWN0ICVpbiUgc2l6ZXNfdG9fZGlzcGxheSkgJT4lIAogIGdyb3VwX2J5KHllYXIgPSB5ZWFyKHB1Yl9kYXRlKSwgcHJvcF90cnVlX2VmZmVjdCkgJT4lCiAgbXV0YXRlKHBvd2VyID0gbWVhbihwb3dlciwgbmEucm0gPSBUUlVFKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IHBvd2VyKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgoc2l6ZSA9IDAuMykgKwogIGZhY2V0X3dyYXAofiBwcm9wX3RydWVfZWZmZWN0X3BocmFzZSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJFdm9sdXRpb24gb2YgbWVhbiBwb3dlciBpbiB0aGUgbGl0ZXJhdHVyZSB3aXRoIHB1YmxpY2F0aW9uIGRhdGUiLCAKICAgIHggPSAiUHVibGljYXRpb24gZGF0ZSIsIAogICAgeSA9ICJQb3dlciIKICApCgpyZXRyb19hbmFseXNpc19wdWJkYXRlICU+JSAKICBmaWx0ZXIocHJvcF90cnVlX2VmZmVjdCAlaW4lIHNpemVzX3RvX2Rpc3BsYXkpICU+JSAKICBncm91cF9ieSh5ZWFyID0geWVhcihwdWJfZGF0ZSksIHByb3BfdHJ1ZV9lZmZlY3QpICU+JQogIG11dGF0ZSh0eXBlTSA9IG1lYW4odHlwZU0sIG5hLnJtID0gVFJVRSkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSB0eXBlTSkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKHNpemUgPSAwLjMpICsKICAjIGdlb21fc21vb3RoKHNpemUgPSAwLjMsIGZvcm11bGEgPSB5wqB+IHggKyBJKHheMikpICsKICBmYWNldF93cmFwKH4gcHJvcF90cnVlX2VmZmVjdF9waHJhc2UpICsKICBsYWJzKAogICAgdGl0bGUgPSAiRXZvbHV0aW9uIG9mIG1lYW4gdHlwZSBNIGVycm9yIGluIHRoZSBsaXRlcmF0dXJlIHdpdGggcHVibGljYXRpb24gZGF0ZSIsIAogICAgeCA9ICJQdWJsaWNhdGlvbiBkYXRlIiwgCiAgICB5ID0gIlR5cGUgTSIKICApCgpyZXRyb19hbmFseXNpc19wdWJkYXRlICU+JSAKICBmaWx0ZXIocHJvcF90cnVlX2VmZmVjdCAlaW4lIHNpemVzX3RvX2Rpc3BsYXkpICU+JSAgCiAgZ3JvdXBfYnkoeWVhciA9IHllYXIocHViX2RhdGUpLCBwcm9wX3RydWVfZWZmZWN0KSAlPiUKICBtdXRhdGUodHlwZVMgPSBtZWFuKHR5cGVTLCBuYS5ybSA9IFRSVUUpKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gdHlwZVMpKSArCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9zbW9vdGgoc2l6ZSA9IDAuMykgKwogIGZhY2V0X3dyYXAofiBwcm9wX3RydWVfZWZmZWN0X3BocmFzZSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJFdm9sdXRpb24gb2YgbWVhbiB0eXBlIFMgZXJyb3IgaW4gdGhlIGxpdGVyYXR1cmUgd2l0aCBwdWJsaWNhdGlvbiBkYXRlIiwgCiAgICB4ID0gIlB1YmxpY2F0aW9uIGRhdGUiLCAKICAgIHkgPSAiVHlwZSBTIgogICkKYGBgCgpUaGVyZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGEgY2xlYXIgdHJlbmQgaW4gdGhlIGV2b2x1dGlvbiBvZiBwb3dlciBhbmQgdHlwZSBTIGVycm9yLiBIb3dldmVyLCB0eXBlIE0gZXJyb3Igc2VlbXMgdG8gaGF2ZSBwZWFrZWQgaW4gdGhlIDIwMTBzIGFuZCB0byBiZSBkZWNyZWFzaW5nIGFnYWluIHJlY2VudGx5LgoKIyMjIEFuYWx5c2lzIG9mIGFydGljbGVzIHdpdGggbG93IHBvd2VyCgpJbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgd2Ugbm90aWNlZCB0aGF0IGEgbm9uIG5lZ2xpZ2libGUgbnVtYmVyIG9mIHN0dWRpZXMgc2VlbWVkIHRvIHN1ZmZlciBmcm9tIGEgbG93IHBvd2VyIGlzc3VlIGFuZCBhc3NvY2lhdGVkIHR5cGUgTSBlcnJvci4gV2UgY29uc2lkZXIgdGhhdCBhbiBlc3RpbWF0ZSBoYXMgbG93IHBvd2VyIGlmIGl0cyBjb21wdXRlZCBwb3dlciBpcyBsb3dlciB0aGFuIDgwJSBpZiB0aGUgdHJ1ZSBlZmZlY3QgaXMgMy80IG9mIHRoZSBtZWFzdXJlZCBlZmZlY3QuIDgwJSBpcyB0aGUgdGhyZXNob2xkIHVzdWFsbHkgdXNlZCBpbiBwb3dlciBhbmFseXNlcyBidXQgMy80IGlzIGFyYml0cmFyeSBhbmQgY291bGQgYmUgY2hhbmdlZCBlYXNpbHkgaW4gYSByb2J1c3RuZXNzIGNoZWNrLiBGb2xsb3dpbmcgdGhpcyBjcml0ZXJpb24sIHRoZSBudW1iZXIgYW5kIHByb3BvcnRpb24gb2YgZXN0aW1hdGVzIHdpdGggbG93IHBvd2VyIGlzIGFzIGZvbGxvd3M6CgpgYGB7cn0KYXJ0aWNsZXNfbG93X2FkZXF1YXRlIDwtIHJldHJvX2FuYWx5c2lzICU+JSAKICBmaWx0ZXIocHJvcF90cnVlX2VmZmVjdCA9PSAwLjc1KSAlPiUgCiAgbXV0YXRlKAogICAgbG93X3Bvd2VyID0gKHBvd2VyIDw9IDAuOCksIAogICAgbG93X3Bvd2VyX3BocmFzZSA9IGlmZWxzZShsb3dfcG93ZXIsICJMb3cgcG93ZXIiLCAiQWRlcXVhdGUgcG93ZXIiKQogICkgJT4lIAogIGxlZnRfam9pbihhYnN0cmFjdHNfYW5kX21ldGFkYXRhLCBieSA9ICJkb2kiKQoKYXJ0aWNsZXNfbG93X2FkZXF1YXRlICU+JSAKICBjb3VudChsb3dfcG93ZXJfcGhyYXNlKSAlPiUgCiAgbXV0YXRlKHByb3AgPSBuL3N1bShuKSkgJT4lIAogIGthYmxlKGNvbC5uYW1lcyA9IGMoIlBvd2VyIiwgIk51bWJlciBvZiBlc3RpbWF0ZXMiLCAiUHJvcG9ydGlvbiIpKQpgYGAKPCEtLSBOb24gc3VycHJpc2luZ2x5LCBtb3N0IG9mIHRoZSB0eXBlIE0gYW5kIHR5cGUgUyBlcnJvcnMgYXJlIGFzc29jaWF0ZWQgd2l0aCAibG93IHBvd2VyIiAtLT4KCjwhLS0gYGBge3J9IC0tPgo8IS0tIHJldHJvX2FuYWx5c2lzICU+JSAgLS0+CjwhLS0gICBmaWx0ZXIocHJvcF90cnVlX2VmZmVjdCAlaW4lIGMoMC41LCAwLjc1LCAxKSkgJT4lICAgLS0+CjwhLS0gICBmaWx0ZXIodHlwZU0gPCAyLjUpICU+JSAgLS0+CjwhLS0gICBtdXRhdGUobG93X3Bvd2VyID0gaWZlbHNlKGxvd19wb3dlciwgIkxvdyBwb3dlciIsICJBZGVxdWF0ZSBwb3dlciIpKSAlPiUgIC0tPgo8IS0tICAgZ2dwbG90KGFlcyh4ID0gdHlwZU0sIGZpbGwgPSBsb3dfcG93ZXIpKSArICAtLT4KPCEtLSAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMCkgKyAtLT4KPCEtLSAgIGZhY2V0X3dyYXAofiBwcm9wX3RydWVfZWZmZWN0KSArIC0tPgo8IS0tICAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgdHlwZSBNIGVycm9yIGluIHRoZSBsaXRlcmF0dXJlIiwgc3VidGl0bGUgPSAiSWYgdGhlIG1hZ25pdHVkZSBvZiB0cnVlIGVmZmVjdCBpcyBhIGZyYWN0aW9uIG9mIHRoZSBtZWFzdXJlZCBlZmZlY3QiKSArIC0tPgo8IS0tICAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lID0gIiIpIC0tPgo8IS0tIGBgYCAtLT4KCldlIGludmVzdGlnYXRlIHRoZSBwYXJ0aWN1bGFyaXRpZXMgb2YgdGhlIGFydGljbGVzIHdpdGggbG93IHBvd2VyLiBXZSBzdGFydCBieSByZXByb2R1Y2luZyB0aGUgYW5hbHlzZXMgdXNlZCB0byBjb21wYXJlIGFydGljbGVzIGZvciB3aGljaCB3ZSByZXRyaWV2ZWQgYW4gZWZmZWN0IGFuZCB0aG9zZSBmb3Igd2hpY2ggd2UgZGlkIG5vdC4gRmlyc3QsIHdlIGxvb2sgaW50byB0aGUgZGlzdHJpYnV0aW9uIG9mIHB1YmxpY2F0aW9uIGRhdGVzLgoKYGBge3J9CnNldF9tZWRpb2NyZV9hbGwoc2Vjb25kX3BhaXIgPSBUUlVFKQoKYXJ0aWNsZXNfbG93X2FkZXF1YXRlICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9kZW5zaXR5KAogICAgYWVzKHggPSB5ZWFyKHB1Yl9kYXRlKSwgZmlsbCA9IGxvd19wb3dlcl9waHJhc2UsIGNvbG9yID0gbG93X3Bvd2VyX3BocmFzZSksCiAgICBhbHBoYSA9IDAuNAogICkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgcHVibGljYXRpb24geWVhciIsIAogICAgc3VidGl0bGUgPSAiQ29tcGFyaXNvbiBiZXR3ZWVuIGFydGljbGVzIGZvciB3aXRoIGxvdyBhbmQgYWRlcXVhdGUgcG93ZXIiLCAKICAgIHggPSAiUHVibGljYXRpb24geWVhciIsIAogICAgeSA9ICJEZW5zaXR5IgogICkgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZSA9ICIiKQpgYGAKCkl0IHNlZW1zIHRoYXQgbGVzcyBhcnRpY2xlcyB3aXRoIGxvdyBwb3dlciBoYXZlIGJlZW4gcHVibGlzaGVkIHJlY2VudGx5LCBpbiBjb21wYXJpc29uIHRvIGFydGljbGVzIHdpdGggYWRlcXVhdGUgcG93ZXIuIFRoaXMgY29uZmlybXMgb3VyIHByZXZpb3VzIGZpbmRpbmcuIFdlIHRoZW4gbG9vayBpbnRvIHRoZSBkaXN0cmlidXRpb24gb2YgYXJ0aWNsZXMKCmBgYHtyIGZpZy5hc3A9MX0KYXJ0aWNsZXNfbG93X2FkZXF1YXRlICU+JQogIG11dGF0ZShqb3VybmFsID0gZmN0X2x1bXBfbihqb3VybmFsLCAyMCkpICU+JSAKICBmaWx0ZXIoam91cm5hbCAhPSAiT3RoZXIiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fYmFyKGFlcyh5ID0gZmN0X3JldihmY3RfaW5mcmVxKGpvdXJuYWwpKSwgZmlsbCA9IGxvd19wb3dlcl9waHJhc2UpKSArCiAgbGFicygKICAgIHggPSAiTnVtYmVyIG9mIGFydGljbGVzIiwKICAgIHkgPSBOVUxMLAogICAgdGl0bGUgPSAiTWFpbiBqb3VybmFscyBpbiB3aGljaCBlZmZlY3RzIGhhdmUgYmVlbiBwdWJsaXNoZWQiLAogICAgc3VidGl0bGUgPSAiQ29tcGFyaXNvbiBiZXR3ZWVuIGVmZmVjdHMgdGhhdCBoYXZlIGFkZXF1YXRlIHBvd2VyIG9yIG5vdCIKICApICsKICAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lID0gIiIpCmBgYAoKSW50ZXJlc3RpbmdseSwgc29tZSBqb3VybmFscywgc3VjaCBhcyAiU2NpZW5jZSBvZiB0aGUgVG90YWwgRW52aXJvbm1lbnQiLCB0aGUgIkludGVybmF0aW9uYWwgSm91cm5hbCBvZiBPY2N1cGF0aW9uYWwgTWVkaWNpbmUgYW5kIEVudmlyb25tZW50YWwgSGVhbHRoIiwgdGhlICJDaG9jaHJhbmUgRGF0YWJhc2Ugb2YgU3lzdGVtYXRpYyBSZXZpZXdzIiwgIkVudmlyb25tZW50YWwgc2NpZW5jZSBhbmQgcG9sbHV0aW9uIHJlc2VhcmNoIiBhbmQgdGhlICJKb3VybmFsIG9mIEV4cG9zdXJlIFNjaWVuY2UgYW5kIEVudmlyb25tZW50YWwgZXBpZGVtaW9sb2d5IiBwdWJsaXNoIGxhcmdlIHNoYXJlIG9mIGxvdyBwb3dlciBzdHVkaWVzLiBPbiB0aGUgY29udHJhcnksIEJNSiBPcGVuIHB1Ymxpc2ggdmVyeSBmZXcgbG93IHBvd2VyIHN0dWRpZXMuCgpIZXJlIGFsc28sIGdyb3VwaW5nIHRoZSBqb3VybmFscyBpbnRvIGJpZyBtYWluIHRoZW1lcyBjb3VsZCBiZSBtb3JlIGluc3RydWN0aXZlLgoKYGBge3J9CmFydGljbGVzX2xvd19hZGVxdWF0ZSAlPiUgCiAgZ3JvdXBfYnkoeWVhciA9IHllYXIocHViX2RhdGUpKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgcHJvcF9sb3dfcG93ZXIgPSBzdW0obG93X3Bvd2VyKS9uKCksCiAgICAuZ3JvdXBzID0gImRyb3AiCiAgKSAlPiUgCiAgIyBmaWx0ZXIobG93X3Bvd2VyKSAlPiUKICBmaWx0ZXIoeWVhciA8PSAyMDIwKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IHByb3BfbG93X3Bvd2VyKSkgKyAKICBnZW9tX3BvaW50KGNvbG9yID0gIiM4RDA0MjIiKSArCiAgIyBnZW9tX2xpbmUobGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fc21vb3RoKGNvbG9yID0gIiM4RDA0MjIiLCBmaWxsID0gIiM4RDA0MjIiKSArCiAgeWxpbShjKDAsMSkpICsKICBsYWJzKAogICAgdGl0bGUgPSAiRXZvbHV0aW9uIG9mIHRoZSBwcm9wb3J0aW9uIG9mIGFydGljbGVzIHdpdGggbG93IHBvd2VyIiwKICAgIHggPSAiWWVhciBvZiBwdWJsaWNhdGlvbiIsCiAgICB5ID0gIlByb3BvcnRpb24gb2YgZXN0aW1hdGVzIHdpdGggYSBsb3cgcG93ZXIiCiAgKQpgYGAKClRoZXJlIGRvZXMgbm90IHNlZW0gdG8gYmUgYSBjbGVhciB0cmVuZCBpbiB0aGUgcHJvcG9ydGlvbiBvZiBhcnRpY2xlcyB3aXRoIGxvdyBwb3dlci4gSWYgYW55dGhpbmcgaXQgaGFzIHNsaWdodGx5IGRlY3JlYXNlZCBpbiB0aGUgbGFzdCBkZWNhZGUuCgpgYGB7cn0KYXJ0aWNsZXNfbG93X2FkZXF1YXRlICU+JSAKICBncm91cF9ieShuX29ic19xdWFudCA9IGN1dF9pbnRlcnZhbChuX29icywgbiA9IDEwKSkgJT4lIAogIHN1bW1hcmlzZSgKICAgIHByb3BfbG93X3Bvd2VyID0gc3VtKGxvd19wb3dlcikvbigpLAogICAgLmdyb3VwcyA9ICJkcm9wIgogICkgJT4lIAogICMgZmlsdGVyKGxvd19wb3dlcikgJT4lCiAgIyBmaWx0ZXIoeWVhciA8PSAyMDIwKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gbl9vYnNfcXVhbnQsIHkgPSBwcm9wX2xvd19wb3dlcikpICsgCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjOEQwNDIyIikgKwogICMgZ2VvbV9saW5lKGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAwLjIpICsKICBnZW9tX3Ntb290aChjb2xvciA9ICIjOEQwNDIyIiwgZmlsbCA9ICIjOEQwNDIyIikgKwogIHlsaW0oYygwLDEpKSArCiAgbGFicygKICAgIHRpdGxlID0gIkV2b2x1dGlvbiBvZiB0aGUgcHJvcG9ydGlvbiBvZiBhcnRpY2xlcyB3aXRoIGxvdyBwb3dlciIsCiAgICB4ID0gIlllYXIgb2YgcHVibGljYXRpb24iLAogICAgeSA9ICJQcm9wb3J0aW9uIG9mIGVzdGltYXRlcyB3aXRoIGEgbG93IHBvd2VyIgogICkKYGBgCgpXZSBhbHNvIGxvb2sgaW50byBwb3RlbnRpYWwgZGlzcGFyaXRpZXMgaW4gdGVybXMgb2YgcG9sbHV0YW50CgpgYGB7ciBmaWcuYXNwPTF9CmFydGljbGVzX2xvd19hZGVxdWF0ZSAlPiUgCiAgdW5uZXN0KHBvbGx1dGFudCkgJT4lCiAgZmlsdGVyKCFpcy5uYShwb2xsdXRhbnQpKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9iYXIoCiAgICBhZXMoeSA9IGZjdF9yZXYoZmN0X2luZnJlcShwb2xsdXRhbnQpKSwgZmlsbCA9IGxvd19wb3dlcl9waHJhc2UpLCAKICAgIHBvc2l0aW9uID0gImZpbGwiCiAgKSArCiAgbGFicygKICAgIHggPSAiUHJvcG9ydGlvbiBvZiBhcnRpY2xlcyIsCiAgICB5ID0gTlVMTCwKICAgIHRpdGxlID0gIlByb3BvcnRpb24gb2YgYXJ0aWNsZXMgd2l0aCBsb3cgYW5kIGFkZXF1YXRlIHBvd2VyIiwKICAgIHN1YnRpdGxlID0gIkNvbXBhcmlzb24gYmV0d2VlbiBhcnRpY2xlcyBzdHVkaW5nIGEgZGlmZmVyZW50IHBvbGx1dGFudHMiLAogICAgY2FwdGlvbiA9ICJQb2xsdXRhbnRzIG9yZGVyZWQgZnJvbSB0aGUgbW9zdCBmcmVxdWVudCB0byB0aGUgbGVhc3QiCiAgKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lID0gIiIpCmBgYAoKVGhlcmUgZG9lcyBub3Qgc2VlbSB0byBiZSBzdGFyayBkaWZmZXJlbmNlcyBieSBwb2xsdXRhbnQgdHlwZS4gCgpXZSB0aGVuIGNvbXBhcmUgdGhlc2Ugb3V0Y29tZXMgaW4gdGVybXMgb2Ygb3V0Y29tZSAobW9ydGFsaXR5IG9yIGhvc3BpdGFsIGFkbWlzc2lvbnMpLgoKYGBge3J9CmFydGljbGVzX2xvd19hZGVxdWF0ZSAlPiUKICB1bm5lc3Qob3V0Y29tZSkgJT4lCiAgZmlsdGVyKCFpcy5uYShvdXRjb21lKSkgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21fYmFyKGFlcyhvdXRjb21lLCBmaWxsID0gbG93X3Bvd2VyX3BocmFzZSksIHBvc2l0aW9uID0gImZpbGwiKSArCiAgbGFicygKICAgIHggPSBOVUxMLAogICAgeSA9ICJQcm9wb3J0aW9uIG9mIGFydGljbGVzIiwKICAgIHRpdGxlID0gIk51bWJlciBvZiBhcnRpY2xlcyBjb25zaWRlcmluZyBhIGdpdmVuIG91dGNvbWUiLAogICAgc3VidGl0bGUgPSAiQ29tcGFyaXNvbiBiZXR3ZWVuIGFydGljbGVzIHdpdGggbG93IGFuZCBhZGVxdWF0ZSBwb3dlciIKICApICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWUgPSAiIikKYGBgCgpUaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIGRpZmZlcmVuY2UgYWxvbmcgdGhpcyBkaW1lbnNpb24uCgoK